2.6.1 何时不应命名生命周期

译文 · 基于 Learning Rust

何时不应命名生命周期

原文链接: https://quinedot.github.io/rust-learning/m-naming.html

有时新手会试图通过让代码更泛型来解决借用检查错误,这通常涉及添加生命周期并命名之前被省略的生命周期:

1
2
3
4
5
6
# struct S; impl S {
fn quz<'a: 'b, 'b>(&'a mut self) -> &'b str { todo!() }

// (由于 `'a: 'b` 约束,含义仍然是"对返回值的使用让 `*self` 保持独占借用":
// `'a` 必须在 `'b` 有效的任何地方都有效。)
# }

但这实际上并不比下面这个允许多更多可能性:

1
2
3
# struct S; impl S {
fn quz<'b>(&'b mut self) -> &'b str { todo!() }
# }

因为在第一个例子中,&'a mut self 可以强制转换为 &'b mut self。而且事实上,你希望它这样做——因为你通常不想让 self 被独占借用的时间超过必要的长度。

到了这一步,你可以利用生命周期省略,坚持使用:

1
2
3
# struct S; impl S {
fn quz(&mut self) -> &str { todo!() }
# }

随着协变性和函数生命周期省略变得更直观,你会逐渐培养出何时命名生命周期毫无意义的感觉。像第一个例子那样添加多余的生命周期,往往会让理解借用错误变得更难,而不是更容易。

最后修改 August 23, 2026: 更新 (499855b16)