小编vik*_*784的帖子

在 Rust '21 中捕获闭包

我刚刚发现以下代码可以在 Rust 21 中编译(以前在 18 中不能编译)

fn get_func (i: &mut i32) -> impl Fn() -> i32 + '_ {
    || *i
} 
Run Code Online (Sandbox Code Playgroud)

是否有隐含的牵连i?如果是这样,那么为什么下面的代码也能编译?

fn get_func (i: &mut i32) -> impl Fn() -> i32 + '_ {
    let f = || *i;
    
    println!("{:?}", i);  // was expecting here to give borrow of moved variable error, `&mut` doesnt implement `Copy` trait
    
    f
}
Run Code Online (Sandbox Code Playgroud)

或者它是隐式移动(在本例中是复制)所指向的值?但是下面的代码应该可以编译,但没有编译——表明它正在移动引用。

fn get_func (i: &mut i32) -> impl Fn() -> i32 {
    || *i
}
Run Code Online (Sandbox Code Playgroud)

closures reference move rust

12
推荐指数
1
解决办法
257
查看次数

调用返回引用的函数时了解非词法生命周期

以下函数适用于 NLL

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

    let z = &mut y; 

    *y = 12;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我用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;
}
Run Code Online (Sandbox Code Playgroud)

给出以下错误:

error[E0506]: cannot assign to `*y` because it is borrowed
  --> …
Run Code Online (Sandbox Code Playgroud)

ownership rust borrow-checker borrowing

3
推荐指数
1
解决办法
71
查看次数

标签 统计

rust ×2

borrow-checker ×1

borrowing ×1

closures ×1

move ×1

ownership ×1

reference ×1