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

Rust 生命周期参数和借用在函数签名中如何相互作用,rust,Rust,假设我有一个函数,在Rust中具有以下签名: fn f<'a>(x: &'a i32) -> &'a i32; 在这种情况下,锈蚀借用检查器将y视为借用x。为什么?除了“因为您在参数类型和返回类型中使用了相同的生存期参数”之外,还有什么更深层次的原因呢 let x: i32 = 0; 'a: { // definition of a lifetime (not real syntax) let y: &'a i32 = f::<'a>

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

fn f<'a>(x: &'a i32) -> &'a i32;

在这种情况下,锈蚀借用检查器将
y
视为借用
x
。为什么?除了“因为您在参数类型和返回类型中使用了相同的生存期参数”之外,还有什么更深层次的原因呢

let x: i32 = 0;
'a: { // definition of a lifetime (not real syntax)
    let y: &'a i32 = f::<'a>(&'a x) // &'a x is also not real, though interestingly rustc recognizes it
}
设x:i32=0;
'a:{//生存期的定义(非真实语法)
设y:&'a i32=f:函数签名

fn f<'a>(x: &'a i32) -> &'a i32;

关于你的具体问题:

那么,让我们假设我执行以下操作:

let x = 0;
let y = f(&x);
let x = 0;
let y = f(&x);
在这种情况下,锈蚀借用检验员认为y借用x。为什么

答案是因为
f
的函数签名说明了这一点。举个例子,假设我们将签名更改为:

fn f<'a, 'b>(x: &'a i32, z: &'b i32) -> &'a i32;

在上面的代码中,
y
借用了
x
,而不是
z
。这是因为
f
的返回值有一个
'a
寿命,它与
x
的寿命相同。

谢谢你的解释。我对rust如何仅使用寿命跟踪可能的别名感到困惑(因为生命周期只关心某个代码对哪个区域有效)但我现在明白了。借用检查器的所有规则(不仅是与悬挂引用有关的规则,还有与别名相关的规则)都被转换为生命周期约束。这些生命周期约束形成了一个不等式系统(使用子集关系进行偏序)。如果此系统至少有一个解决方案,则代码根据借用检查器有效。
fn f<'a, 'b>(x: &'a i32, z: &'b i32) -> &'a i32;
let x = 0;
let z = 1;
let y = f(&x, &z);