rust - Rust 中的一个可变借用或多个不可变借用……为什么?

为什么 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/

相关文章:

c++ - 如何在 SSE2 中为 8 位和 16 位整数实现 vector 右移和左移?

c++ - 你能用折叠表达式实现 fn(x1 ^ fn(x0)) 吗?

go - gcloud 函数部署 go 运行时错误 "undefined: unsafe.Slice

regex - 删除换行符后跟多个选项卡正则表达式

ruby - 如何在 Ruby 中创建可调用属性

c - 使用个性系统调用使堆栈可执行

r - 如何在组内创建字母序列?

awk - 使用 awk 将字段分隔符 ',' 更改为空格

c# - 在 C# 中将小驼峰命名法转换为 PascalCase?

python - 在python中打印出两个列表的组合