生命周期参数和借用如何在函数签名中交互

假设我在 Rust 中有一个具有以下签名的函数:

fn f<'a>(x: &'a i32) -> &'a i32;
fn f<'a>(x: &'a i3
let 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的一生。


以上是生命周期参数和借用如何在函数签名中交互的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>