我不明白为什么函数 fn1 无法编译,即 为什么“让 z = &mut x;”之前无法分配 存储在“y”中的引用不再使用(“y”被重新分配 到别的东西)。
此外,为什么fn2和fn3在“逻辑上”做同样的事情时编译正常?
fn2 实际上与 fn1 不同,“y”超出范围而不是重新分配,但那是 仅在“y”指针存储方面不同,而在“y”指向什么方面不同。
fn3 实际上与 fn1 不同,“z”是从“y”分配的,而不是直接从“&mut x”分配的。
fn fn1() {
let mut x = 1i32;
let mut somethingelse = 7i32;
let mut y = &mut x;
*y = *y + 1;
println!("y = {}", *y);
y = &mut somethingelse;
println!("just something: {}", *y);
// y is not used anymore...
let z = &mut x;
*z = *z + 1;
println!("z = {}", *z);
}
fn fn2() {
let mut x = 1i32;
{
let y = &mut x;
*y = *y + 1;
println!("y = {}", *y);
}
let z = &mut x;
*z = *z + 1;
println!("z = {}", *z);
}
fn fn3() {
let mut x = 1i32;
let z;
let y = &mut x;
*y = *y + 1;
println!("y = {}", *y);
z = y;
*z = *z + 1;
println!("z = {}", *z);
}
最佳答案
目前,借用范围是词法的,也就是说,它们对应于代码中的大括号。有a bug to change this考虑到像 fn1
这样的情况,但就像您在 fn2
中看到的那样,现在有解决方法。
对于fn3
,如果您尝试再次使用y
,您将收到此错误:
error: use of moved value: `*y`
这是因为编译器可以告诉(通过语句 z = y
)不再需要 y
,从而将可变借位移动到 z
,使 y
无效。
关于rust - 即使先前借用的是 "forgotten"也无法借用指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28077309/