繁体   English   中英

Rust 多生命周期结构无法访问超出较短生命周期参数

[英]Rust multiple lifetimes struct can't access beyond the less longer lifetime parameter

struct TwoStrRef<'a, 'b> {
    str1: &'a str,
    str2: &'b str,
}

fn main() {
    let a_ref_struct;
    let string_1 = String::from("hello");
    let str_ref;
    {
        let string_2 = String::from("world");

        a_ref_struct = TwoStrRef {
            str1: &string_1,
            str2: &string_2,
        };

        str_ref = a_ref_struct.str1;
    }

    // str_ref; // Ok

    // a_ref_struct.str1;  // Error: `string_2` does not live long enough borrowed value does not live long enough
}

struct TwoStrRef有两个生命周期参数a''b ,我将string_1string_2的引用(它们在不同的范围内, string_1是更长的)分配给字段str_1str_2 ,当我尝试访问a_ref_struct.str1超出string_2的范围(但与string_1相同),编译器会抛出错误,这表明string_2的寿命不够长。 str1字段不是包含不在其范围之外的string_1的引用吗? 为什么如果我将 str1 引用分配给str_ref ,我可以在与string_1相同的范围内访问它?

str1字段不是包含不在其范围之外的string_1的引用吗?

a_ref_structstring_2超出范围之前被删除:这是必需的,因为否则对其str2字段的任何访问(例如,可能在其删除处理程序中发生)都将无效。 实际上,如果在删除string2之后存在a_ref_struct ,则它的str2将是对已释放内存的引用,这是未定义的行为,即使该引用从未被访问过。

为什么如果我将 str1 引用分配给str_ref ,我可以在与string_1相同的范围内访问它?

在那里,您只是获取a_ref_struct.str1中保存的引用的副本(生命周期为'astring_1 )并将该副本存储到str_ref中。 然后可以(并且是)删除a_ref_struct而不会影响该(复制的)引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM