为什么 Rust 只允许一个可变借用或多个不可变借用?即使在单线程编程中,它的行为是否有助于防止容易出错的代码?如果是,请举例说明什么?
最佳答案
是的,这有助于防止单线程情况下的错误。考虑这个简单的案例:
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!
这在 Rust 中编译失败,因为 a.clear()
需要可变地借用 a
,但是 b
是不变地借用它。等效代码将使用 std::vector
在 C++ 中编译,但会在运行时表现出未定义的行为。 (这是一个常见的误解,认为 Rust 存在问题,因为它拒绝从 C++ 等其他语言重写的代码,而原始代码在该语言中编译得很好,而事实上,原始代码中可能存在未被发现的内存安全问题.)
请注意,即使 a.push()
也可能使之前获得的引用无效,因为如果内部分配没有更多可用容量,它可能需要为 vec 重新分配存储空间。
可变借用一个值必须排除任何其他重叠借用,因为改变一个值会导致相同值的重叠借用失效。
https://stackoverflow.com/questions/74035338/