2.5.3 生命周期约束
2 分钟阅读
译文 · 基于 Learning Rust
生命周期约束
原文链接: https://quinedot.github.io/rust-learning/st-bounds.html
下面简要介绍你可能在 fn 声明和 impl 块中见到的生命周期约束。
生命周期之间的约束
'a: 'b 约束大致意味着 'long: 'short。
它常被读作「'a 比 'b 活得久」,有时也称为「outlives 约束」或「outlives 关系」。
我个人也喜欢把它读作「'a 对(至少)'b 有效」。
注意 'a 可以与 'b 相同,尽管有「outlives」这个说法,它不必严格更长。在这方面它类似于 >=。因此在这个例子里:
| |
'a 与 'b 实际上必须是同一生命周期。
当函数参数带有嵌套引用(如 &'b Foo<'a>)时,会推断出 'a: 'b 约束。
(泛型)类型与生命周期之间的约束
T: 'a 表示 &'a T 不会立刻成为未定义行为。换言之,若类型 T 包含任何引用或其他生命周期,它们必须至少与 'a 一样长。
你也可以把这些读作「(类型)T 对 'a 有效」。
注意这与类型 T 的值的生存期范围或 drop 范围无关!这种形式最常见的约束是 T: 'static。
这并不意味着类型 T 的值必须贯穿整个程序!它只是说类型 T 没有非 'static 的生命周期。例如 String: 'static,但这并不意味着你不会 drop String。
可以把 outlives 约束视为递归地、按语法结构适用。例如:
| |
(&'s str, Vec<T>): 'limit 成立,当且仅当
&'s str: 'limit成立,当且仅当's: 'limit成立
Vec<T>: 'limit成立,当且仅当T: 'limit成立
(当你用具体的 T 调用该函数时,这一过程可能继续。)
值的生存期范围
出于上述原因,我倾向于从不把值的生存期或 drop 范围称为该值的「生命周期」。尽管值的生存期范围与指向它的引用的生命周期有关联,混淆这两个概念容易导致困惑。
话虽如此,并非所有人都遵循这一约定,因此你可能仍会看到把值的生存期范围称为该值的「生命周期」。区分这两者,一般值得留意。
Rust 生命周期——那些 'a——与借用的持续时间的关系,远比与某个特定值的作用域紧密。