为什么 Rust 中不能推断生命周期?

Gia*_*oco 2 lifetime rust

考虑下面的例子

struct Foo {
    val: &str
}

fn main() {
    let hello = String::from("hello");
    let foo = Foo{ val: &hello[..]};

}
Run Code Online (Sandbox Code Playgroud)

这不会编译,因为需要生命周期。一个非常简单的修复如下:

struct Foo<'a> {
    val: &'a str
}
Run Code Online (Sandbox Code Playgroud)

为什么编译器不能假设(作为合理的默认值)引用的寿命与 struct 一样长Foo?是否有任何用例不会出现这种情况?

kum*_*mo2 6

因为假设引用只要存在就会存在,这显然struct Foo是错误的。例如考虑这个。


fn main() {
    let foo: Foo;
    {
        let string = "foo".to_string();
        foo = Foo {
            val: string.as_str(),
        }
    }

    println!("{}", foo.val);


}

Run Code Online (Sandbox Code Playgroud)

如果编译器在这里假设了“合理的默认值”,并且它的string存在时间与 一样长Foo,那么这将编译 。但我们可以清楚地看到,string在内循环结束后它将被丢弃,但foo即使在内循环结束后仍将存在。

简而言之,它的Foo生命周期取决于 ,&str而不是相反,即Foo不能超过&str