生命周期参数和借用如何在函数签名中交互
假设我在 Rust 中有一个具有以下签名的函数:
fn f<'a>(x: &'a i32) -> &'a i32;
fn f<'a>(x: &'a i3let x = 0;
let y = f(&x);
let x = 0;
let y = f(&x);
假设我执行以下操作:
在这种情况下,Rust 借用检查器会考虑y
借用x
. 为什么?比“因为您在参数类型和返回类型中使用了相同的生命周期参数”更深层次的原因是什么?
回答
函数签名
意味着返回的值f
是对x
参数所指内容的引用,因此它不能超过它。例如,这行不通:
对于您的具体问题
// Compile error
let y = {
let x = 0;
f(&x)
// x is dropped here
};
// Here y still "exists", but x doesn't (y outlives x)
:
假设我执行以下操作:
在这种情况下,Rust 借用检查器认为 y 借用了 x。为什么?
答案是因为函数签名f
告诉它。举个例子,假设我们把签名改成这样:
然后我们这样调用f
fn f<'a, 'b>(x: &'a i32, z: &'b i32) -> &'a i32;
:
在上面的代码中,y
let x = 0;
let z = 1;
let y = f(&x, &z);
借用x
,但不是z
。这是因为返回值f
具有'a
寿命是一样x
的一生。