我刚刚发现以下代码可以在 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) 以下函数适用于 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)