当我尝试在闭包内部重新分配引用指向其他位置时,我注意到了一个奇怪的行为,这个最简示例展示了这种行为,但我无法解释。
这个错误在这里实际上意味着什么?鉴于闭包只在
当尝试从作用域线程中进行相同操作时,无论是否使用
当删除
我的研究让我相信这可能与闭包的FnOnce、FnMut和Fn特性有关,但是我卡住了。
fn main() {
let mut foo: i32 = 5;
let mut foo2: i32 = 6;
let mut borrower = &mut foo; // compiles OK without mut here and below
let mut c = || {
borrower = &mut foo2; // compiles OK without mut here and above
};
}
当引用为&mut
时,这将产生以下错误:
error[E0521]: borrowed data escapes outside of closure
--> src/main.rs:25:9
|
23 | let mut borrower = &mut foo;
| ------------ `borrower` declared here, outside of the closure body
24 | let mut c = || {
25 | borrower = &mut foo2;
| ^^^^^^^^^^^^^^^^^^^^
这个错误在这里实际上意味着什么?鉴于闭包只在
foo2
存活的时候才是活动的,为什么这样做可能是不安全的?为什么它是一个&mut
引用还是其他类型的引用很重要?当尝试从作用域线程中进行相同操作时,无论是否使用
mut
,都无法编译通过。fn main() {
let mut foo: i32 = 5;
let mut foo2: i32 = 6;
let a = Arc::new(Mutex::new(&mut foo)); // removing mut does NOT fix it
println!("{}", a.lock().unwrap());
thread::scope(|s| {
let aa = a.clone();
s.spawn(move ||{
*aa.lock().unwrap() = &mut foo2; // removing mut does NOT fix it
});
});
}
当删除
mut
时,程序可以编译通过,没有错误。
为什么这里的行为与第一个例子不同,而在第一个例子中删除mut
可以满足编译器?我的研究让我相信这可能与闭包的FnOnce、FnMut和Fn特性有关,但是我卡住了。
Mutex
。点击此处查看示例。 - Chayim FriedmanMutex
。点击此处查看示例。 - Chayim FriedmanMutex
。点击此处查看示例。 - undefinedmove
关键字,它会正常工作,但奇怪的是,即使加上了&mut
,它仍然能够工作,与第一个例子相反。很奇怪。 - JMCmove
关键字,它就能正常工作,但奇怪的是,即使有&mut
,它也能正常工作,与第一个示例相反。奇怪。 - JMC