几天前,我开始学习Rust。

这是Jim Blandy着名的《 Programming Rust》的摘录。

对于代码

fn g<'a>(p: &'a i32) { ... }

let x = 10;
g(&x);

这本书说



Q1。 &x的最小生存期意味着什么?

对于代码
fn f(p: &'static i32) { ... }

let x = 10;
f(&x);

Q2。为什么此代码失败?根据我的理解,&'static用于存在于整个程序中的静态全局变量。 link

最佳答案

'static生存期是一个特殊的概念。它指定在程序的整个生命周期内,必须存在由此引用的变量。使用这种情况很少见,甚至需要采取更为罕见的预防措施。

实际上,&'static引用只能在两种情况下发生:

  • const声明
  • static声明

  • 两者都以不同的方式有效地完成了同一件事。然而,差异对这个问题并不重要。在这两种情况下,结果都是一个变量,可在程序的整个生命周期中使用,并且不会被重定位,因此可以保证在借用&'static的情况下。

    既然我们已经介绍了这一点,那么让我们介绍一下您的两个问题。



    当您将函数定义为fn g<'a>(p: &'a i32) { ... }时,您需要p对有效期'a有效;此生存期由编译器确定,因此'a可能的最小。例如,如果从未在函数范围之外使用该引用,则'a将是该函数执行的生命周期。如果您在函数外部使用或引用此借用,则生存期将(显然)更长。

    “尽可能最小”的定义很简单:编译器将根据您启动该引用的时间到您最后一次使用该引用的时间来推断生命周期。依赖借款也很重要,这通常会在处理收款人时咬人。

    之所以最小,是因为您不会遇到没有借贷但总会借到的疯狂情况。当您尝试提供自己的不正确的终生提示时,通常会发生这种情况。在很多情况下,通常最好让编译器决定;但是,通常情况下,最好由编译器决定。另一种情况是struct实现,例如:
    struct Foo<'a> {
        item: &'a u32
    }
    impl<'a> Foo<'a> {
        pub fn compare<'b>(&self, other: &'b u32) {
            ...
        }
    }
    

    在这种情况下,常见的错误是将other描述为'a而不是定义了第二个'b生存期,因此(偶然地)要求在other自身的生存期内借用struct


    let x = 10;
    

    此分配没有'static生存期。它的匿名生存期定义为小于'static,因为严格来说不是定义为全局的。借用'static的唯一方法是将源元素定义为conststatic

    您可以使用以下代码段(playground)来说服自己:
    fn f(p: &'static i32) {
        println!("{}", p)
    }
    
    const FOO:i32 = 3;
    static BAR:i32 = 4;
    
    fn main() {
        f(&FOO); // Works
        f(&BAR); // Also works
    }
    f(&x);
    

    10-07 16:48