为什么允许这样做:
fn main() {
let mut w = MyStruct;
w.fun1();
}
struct MyStruct;
impl MyStruct {
fn fun1(&mut self) {
self.fun2();
}
fn fun2(&mut self) {
println!("Hello world 2");
}
}
在上面的代码中,fun1()
获取了 mut MyStruct
并调用了 fun2()
也使用了 mut MyStruct
.它是一个范围内的双可变引用吗?
最佳答案
这是允许的,因为借用检查器可以断定在执行期间只有一个可变引用被访问。当 fun2
运行时,fun1
中没有其他语句被执行。当 fun1
中的下一条语句(如果有的话)开始执行时,fun2
已经删除了它的可变引用。
在链接的其他问题中:
fn main() {
let mut x1 = String::from("hello");
let r1 = &mut x1;
let r2 = &mut x1;
r1.insert(0, 'w');
}
我们可以说 r2
从未被使用过,但是借用检查器决定它不应该被允许。考虑这个例子:
fn main() {
let mut x1 = String::from("hello");
let r1 = &mut x1;
r1.insert(0, 'w');
let r2 = &mut x1;
r2.insert(0, 'x');
}
这可以正确编译和运行。我想借用检查器假定生命周期 r1
在创建 r2
之前结束。如果这是有道理的,那么调用改变 self
的方法就不足为奇了。
(我不知道为什么第一段代码不能编译,但我很高兴 Rust 团队这样做了。r2
无论如何都不应该在那里。)
关于rust - Rust 中的多重可变引用预防是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58367174/