先占个位置,回头来答(得提醒自己不要忘记……)
生命周期的含义在这里就不谈了(其实我也说不太好),就说一下生命周期的实现策略吧。生命周期在 Rust 中,表现为这样一种形式:与泛型结合紧密的定理证明系统,代码中包含的生命周期符号对应的语义描述了 borrow checker 将要证明的定理。举个简单的栗子:
type Foo ...
type Bar ...
fn foobar(val: &'a Foo) -> &'a Bar { ... }
foobar()的函数签名我们一般可以读作:“接受一个类型为&Foo名为val的参数,返回一个类型为&Bar的值,返回的引用值在函数外使用时,其生命周期不会长于传入的引用值的生命周期'a;在函数内产生时,其生命周期不会短于传入的引用值的生命周期'a”。这里,foobar()建立了一个屏障, borrow checker 的分析过程会被这个函数的 boundary 分为内外两个部分:对内,检查返回值是否满足'a(可以是从val派生而来,也可以是从比如 'static等其他地方派生出来,甚至有可能使用 unsafe 从“虚空”派生出来(当然这个是不是 sound 就另说了));对外,检查在调用它的环境中,返回值的使用是否符合这个生命周期。 这里所写的'a,实际上是一个生命周期参数,而具体的生命周期则会在编译时被代入用于推理。例如:
...
let val = Foo { ... };
...
let ret_val