生命周期可以强制在短生命周期内转化为更长的生命周期,以便可以在本不能工作的作用域中可以正常使用。这可以使用编译器自动推断进行强制转换,也可以进行生命周期的声明来表示其不同。
// Here, Rust infers a lifetime that is as short as possible.
// The two references are then coerced to that lifetime.
fn multiply<'a>(first: &'a i32, second: &'a i32) -> i32 {
first * second
}
// `<'a: 'b, 'b>` reads as lifetime `'a` is at least as long as `'b`.
// Here, we take in an `&'a i32` and return a `&'b i32` as a result of coercion.
fn choose_first<'a: 'b, 'b>(first: &'a i32, _: &'b i32) -> &'b i32 {
first
}
fn main() {
let first = 2; // Longer lifetime
{
let second = 3; // Shorter lifetime
println!("The product is {}", multiply(&first, &second));
println!("{} is the first", choose_first(&first, &second));
};
}
代码解析
核心概念图
长生命周期 '长
└─ 可强制转换为短生命周期 '短
└─ 确保在短生命周期作用域内安全使用
编译器自动生命周期推断
fn multiply<'a>(first: &'a i32, second: &'a i32) -> i32 {
first * second
}
// 编译器行为:
// 1. 自动计算两个参数的最小公共生命周期
// 2. 将两个引用统一为该生命周期
// 示例:当传入长生命周期(&first)和短生命周期(&second)引用时,自动统一为短生命周期
显示生命周期约束
fn choose_first<'a: 'b, 'b>(first: &'a i32, _: &'b i32) -> &'b i32 {
first
}
// 语法解读:
// 'a: 'b 表示 "'a生命周期至少与'b一样长"
// 效果:允许将长生命周期引用安全转换为短生命周期
主函数
fn main() {
let first = 2; // 长生命周期(外层作用域)
{
let second = 3; // 短生命周期(内层作用域)
// 情况1:自动统一生命周期(采用second的短生命周期)
multiply(&first, &second); // first被隐式转换
// 情况2:显式将first转换为当前块的生命周期
choose_first(&first, &second); // 返回&'b i32
};