rust - 惯用地访问可变和不可变向量的元素

标签 rust borrow-checker

如果您需要对所述向量的不可变引用来确定需要如何改变向量,您将如何以这种方式改变向量?例如,我有一段代码看起来像这样,我想复制向量的最后一个元素:

let mut vec: Vec<usize> = vec![123, 42, 10];
// Doesn't work of course:
vec.push(*vec.last().unwrap())
// Works, but is this necessary?
let x = *vec.last().unwrap();
vec.push(x);

最佳答案

immutable reference [...] to determine how you would need to mutate the vector?

简短的回答是你不知道。向量的任何变化都可能可能使所有现有引用无效,使任何 future 的操作访问无效数据,从而可能导致段错误。 Safe Rust 不允许这种可能性。

您的第二个示例创建了向量中值的副本,因此向量发生什么不再重要;该值将继续有效。

第一个示例的不幸之处在于,如果您遵循操作顺序,人们可以判断出不可变值是在突变发生之前检索到的。事实上,这就是多语句版本完全可行的原因!这确实是 Rust 借用检查器的当前限制。有 investigation ongoing看看是否可以取消其中一些类型的限制。

关于rust - 惯用地访问可变和不可变向量的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35544667/

相关文章:

rust - 什么时候静态生命周期不合适?

rust - 将引用分配给不同大小的数组

rust - 如何在Rust中使用Mutex创建关键部分?

rust - 如何调试downcast_ref故障?

mongodb - 如何使用 Rust MongoDB 驱动程序从添加到 GridFS 的文件中获取 ID?

rust - 如何在 Rust 中为应用程序上下文创建句柄?

rust - setter/getter 中的可变借用时间不够长

rust - 我可以确定泛型类型的零值吗?

rust - 在嵌套的 lambda 中借用局部变量

rust - 这个错误是由于编译器对 RefCell 的特殊了解吗?