假设我在 Rust 中有一个具有以下签名的函数:
fn f<'a>(x: &'a i32) -> &'a i32;
Run Code Online (Sandbox Code Playgroud)
假设我执行以下操作:
let x = 0;
let y = f(&x);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Rust 借用检查器会考虑y
借用x
. 为什么?比“因为您在参数类型和返回类型中使用了相同的生命周期参数”更深层次的原因是什么?
函数签名
fn f<'a>(x: &'a i32) -> &'a i32;
Run Code Online (Sandbox Code Playgroud)
意味着返回的值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)
Run Code Online (Sandbox Code Playgroud)
对于您的具体问题:
假设我执行以下操作:
Run Code Online (Sandbox Code Playgroud)let x = 0; let y = f(&x);
在这种情况下,Rust 借用检查器认为 y 借用了 x。为什么?
答案是因为函数签名f
告诉它。举个例子,假设我们把签名改成这样:
fn f<'a, 'b>(x: &'a i32, z: &'b i32) -> &'a i32;
Run Code Online (Sandbox Code Playgroud)
然后我们这样调用f
:
let x = 0;
let z = 1;
let y = f(&x, &z);
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,y
借用x
,但不是z
。这是因为返回值f
具有'a
寿命是一样x
的一生。