rust eclipse 寿命说明

nbnkbykc  于 2023-01-30  发布在  Eclipse
关注(0)|答案(1)|浏览(126)

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);
}

我可以看到yf之前超出作用域,但是我想不出有什么情况,我想要一个结构体,它的字段可以在父结构体之前超出作用域,为什么会有人需要它呢?,通过这个问题的延伸,为什么不总是强制字段和父结构体一样长呢?
同样的问题也适用于函数。我不明白为什么我会想要一些函数,把一些借用的变量作为参数,但变量不存在于整个函数中?我能想到的唯一场景是当涉及到一些并发性时。

sy5wg1nm

sy5wg1nm1#

生存期注解不是针对Foo的,而是针对引用之外/之后使用引用的事物的。

struct Foo<'a> {
    x: &'a i32,
}

fn main() {
    let n = 5;
    let z;
    {
        let f = Foo { x: &n };
        z = f.x;
    };
    println!("{}", z);
}

如果Foo没有跟踪生存期,那么即使f超出范围,编译器也无法知道z是否有效。
换句话说,注解的作用是将引用的生存期“延长”到包含它们的结构体之外。

相关问题