gpt4 book ai didi

rust - 即使之前的借用是 "forgotten"也不能借用指针?

转载 作者:行者123 更新时间:2023-11-29 08:08:06 27 4
gpt4 key购买 nike

我不明白为什么函数 fn1 不能编译,即为什么“让 z = &mut x;”以前不能分配不再使用存储在“y”中的引用(“y”被重新分配到别的东西)。

此外,为什么 fn2fn3 在“逻辑上”做同样的事情时编译正常?

fn2 实际上与 fn1 不同的是,“y”超出范围而不是重新分配,但这是仅在“y”指针存储方面不同,与“y”指向的内容无关。

fn3fn1 的不同之处在于,“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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com