Rust 理解调用返回引用的函数时的非词汇生存期

Rust 理解调用返回引用的函数时的非词汇生存期,rust,borrow-checker,ownership,borrowing,Rust,Borrow Checker,Ownership,Borrowing,以下函数适用于NLL fn main() { let mut x = 1i32; let mut y = &mut x; let z = &mut y; *y = 12; } 但是,如果我用一个函数调用替换语句let z=&mut y(这基本上做了相同的事情),借用检查器会抱怨 fn test<'a>(x:&'a mut &'a mut i32) -> &'a mut i32 { &

以下函数适用于NLL

fn main() {
    let mut x = 1i32;
    let mut y = &mut x;

    let z = &mut y; 

    *y = 12;
}
但是,如果我用一个函数调用替换语句
let z=&mut y
(这基本上做了相同的事情),借用检查器会抱怨

fn test<'a>(x:&'a mut &'a mut i32) -> &'a mut i32 {
    &mut **x
}

fn main() {
    let mut x = 1i32;
    let mut y = &mut x;

    let z = test(&mut y);

    *y = 12;
}

函数
test()
返回的引用已不再使用,因此不应该将其视为“死引用”吗

让我们为程序中的生命周期命名。(这不会编译,但用于演示目的。)

在第一个示例中,我们得到了两个生存期,
'1
'2
。寿命
'2
仅持续一行,因此
y
可在以后使用:

fn main(){
设mut x=1i32//
设mut y=&'1 mut x;//^
//        |
设z=&2 mut y;/|'2 |'1
//        |
*y=12;//v
}
在第二个示例中,由于
test
需要
&'a mut&'a mut i32
,其中
'a
表示相同的寿命,因此外部引用必须与内部引用一样长。这就是我们出现错误的原因:

fn测试和mut i32{
&mut**x
}
fn main(){
设mut x=1i32//
设mut y=&'1 mut x;//^
//        |
设z=test(&'2 mut y);/|'2|'1
//        |
*y=12;//v
}

谢谢!我完全忽略了函数的威力。当它有一个返回的引用时,它可以进一步“强制地拖动”生命周期:)
error[E0506]: cannot assign to `*y` because it is borrowed
  --> src/main.rs:11:5
   |
9  |     let z = test(&mut y);
   |                  ------ borrow of `*y` occurs here
10 |     
11 |     *y = 12;
   |     ^^^^^^^
   |     |
   |     assignment to borrowed `*y` occurs here
   |     borrow later used here