以惯用方式可变和不可变地访问矢量的元素

4

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

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);
1个回答

4

不可变引用[...]来确定您需要如何改变向量吗?

简短的回答是不需要。对向量的任何更改都可能使所有现有引用无效,从而使任何未来操作访问无效数据,可能导致段错误。安全的 Rust 不允许这种可能性。

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

第一个示例的不幸之处在于,如果按照操作顺序,人可以知道在发生突变之前检索到了不可变值。实际上,这就是为什么多语句版本可能存在的原因!这确实是 Rust 借用检查器的当前限制。正在进行调查以查看是否可以解除某些这类限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接