Rust 多个生命周期结构无法访问超过较长的生命周期参数


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字段,当我试图在string_2范围外访问a_ref_struct.str1(但与string_1相同)时,编译器会抛出错误,这表明string_2的生命周期不够长。str1字段不是保存着不在其作用域之外的string_1的引用吗?为什么如果我将str1引用分配给str_ref,我可以在与string_1相同的范围内访问它?

str1字段是否包含不在其作用域之外的string_1的引用?

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

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

在这里,您只是获取a_ref_struct.str1中保存的引用的副本(string_1的生存期'a)并将该副本存储到str_ref中。然后可以(和正在)删除a_ref_struct而不影响(复制的)引用。

最新更新