Rust 为什么编译器假定返回的引用与结构具有相同的生存期?

Rust 为什么编译器假定返回的引用与结构具有相同的生存期?,rust,scope,lifetime,Rust,Scope,Lifetime,我有以下防锈代码: pub struct Foo {} impl Foo { fn bar(&self) -> &[u8] { // obtain some pointer from FFI and return it as a slice (ignore the zeros) unsafe { std::slice::from_raw_parts(0 as *const u8, 0) } } } fn main() {

我有以下防锈代码:

pub struct Foo {}

impl Foo {
    fn bar(&self) -> &[u8] {
        // obtain some pointer from FFI and return it as a slice (ignore the zeros)
        unsafe { std::slice::from_raw_parts(0 as *const u8, 0) }
    }
}

fn main() {
    let a;
    {
        let b = Foo {};
        a = b.bar();
    }
    a;
}
编译时,会产生以下错误:

错误[E0597]:`b`活得不够长
-->src/main.rs:14:13
|
14 | a=b.bar();
|^借来的价值不够长久
15 |     }
|——‘b’在借的时候掉在这里了
16 | a;
|-借用,以后在这里使用
这是我所期望的结果;编译器不会让对某个对象的引用(在我的例子中来自FFI)超过它的容器。然而,我不明白为什么会这样。为什么编译器假定返回的引用应该与结构具有相同的生存期?据它所知,返回的引用可以在任何时候被释放。

因为,如果编译器能够理解,您不必为每个引用都添加生命期注释。但是,您应该知道它的存在,以便在编写时知道:

fn bar(&self) -> &[u8]
编译器将其推断为:

fn bar<'a>(&'a self) -> &'a [u8]
fn条和'a[u8]
因此
b.bar()
中的切片被绑定到
b

的生存期,因为如果编译器能够理解,您不必用生存期注释每个引用。但是,您应该知道它的存在,以便在编写时知道:

fn bar(&self) -> &[u8]
编译器将其推断为:

fn bar<'a>(&'a self) -> &'a [u8]
fn条和'a[u8]
因此
b.bar()
中的切片绑定到
b
的生存期