Rust noob在这里阅读关于explicit annotation of lifetimes的文章。我看到这里有很多关于它的问题,所以我希望这篇文章没有重复。
对我来说,this回答了为什么编译器需要这样的注解,但没有回答为什么用户需要这样的注解。
struct Foo<'a> {
x: &'a i32,
}
fn main() {
let f : Foo;
{
let n = 5; // variable that is invalid outside this block
let y = &n;
f = Foo { x: y };
};
println!("{}", f.x);
}
我可以看到y
在f
之前超出作用域,但是我想不出有什么情况,我想要一个结构体,它的字段可以在父结构体之前超出作用域,为什么会有人需要它呢?,通过这个问题的延伸,为什么不总是强制字段和父结构体一样长呢?
同样的问题也适用于函数。我不明白为什么我会想要一些函数,把一些借用的变量作为参数,但变量不存在于整个函数中?我能想到的唯一场景是当涉及到一些并发性时。
1条答案
按热度按时间sy5wg1nm1#
生存期注解不是针对
Foo
的,而是针对引用之外/之后使用引用的事物的。如果
Foo
没有跟踪生存期,那么即使f
超出范围,编译器也无法知道z
是否有效。换句话说,注解的作用是将引用的生存期“延长”到包含它们的结构体之外。