即使之前的借用是 "forgotten" 也不能借用指针?
Cannot borrow pointer even if previous borrow is "forgotten"?
我不明白为什么函数 fn1 不能编译,即
为什么 "let z = &mut x;" 之前不能赋值
不再使用存储在 "y" 中的引用("y" 已重新分配
到别的地方)。
此外,为什么 fn2 和 fn3 在做 "logically" 相同的事情时编译正常?
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
无效。
我不明白为什么函数 fn1 不能编译,即 为什么 "let z = &mut x;" 之前不能赋值 不再使用存储在 "y" 中的引用("y" 已重新分配 到别的地方)。
此外,为什么 fn2 和 fn3 在做 "logically" 相同的事情时编译正常?
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
无效。