Rust 中的一项可变借用或许多不可变借用......为什么?

Hyu*_*Bae 2 rust

为什么 Rust 只允许一种可变借用或多种不可变借用?即使在单线程编程中,它的行为对于防止容易出现错误的代码是否有用?如果是的话,有什么例子吗?

cdh*_*wie 8

是的,这有助于防止单线程情况下的错误。考虑这个简单的情况:

let a = vec![1i32];

let b = &a[0]; // Borrows the first element of the Vec.

a.clear();

println!("{}", b); // Oops, the value b references doesn't exist anymore!
Run Code Online (Sandbox Code Playgroud)

这无法在 Rust 中编译,因为a.clear()需要可变借用a,但又b是一成不变地借用它。等效代码可以使用 C++ 进行编译std::vector,但会在运行时表现出未定义的行为。(这是一个常见的误解,认为 Rust 存在问题,因为它拒绝其他语言(如 C++)重写的代码,而原始代码在该语言中编译得很好,而事实上,原始代码中可能存在未被发现的内存安全问题.)

请注意,甚至a.push()可能会使之前获得的引用无效,因为如果内部分配没有更多可用容量,则可能需要为 vec 重新分配存储空间。

可变借用值必须排除任何其他重叠借用,因为改变值可能会导致相同值的重叠借用无效。