rust - Rust 中的多重可变引用预防是如何工作的?

标签 rust borrow-checker borrowing

为什么允许这样做:

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/

相关文章:

network-programming - 如何使用 UdpSocket 接收任意长度的数据?

rust - 在循环中构建 std::process::Command 时类型不匹配

rust - 为什么不能在同一结构中存储值和对该值的引用?

rust - 如何删除满足条件的 BTreeMap 或 HashMap 的第一个元素?

rust - 构建向量树

rust - 在匹配语句中重用匹配变量

rust - 为什么借用的字符串字面量可以通过伪造生命周期比其所有者长寿?

rust - 从 Rust 中的元组内的自有盒子中借用

vector - Rust `Vec`-无法在 `Vec`方法内借用 `impl`作为不可变的(错误[E0502])

function - 在 Rust 中实际需要 move 到函数的情况