以惯性方式可变地且不可变地访问向量的元素

时间:2016-02-22 02:01:26

标签: 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);

1 个答案:

答案 0 :(得分:4)

  

不可变参考[...]确定你需要如何变异向量?

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

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

第一个例子的不幸之处在于,如果按照操作顺序,人类可以告诉在变异发生之前检索到不可变值。事实上,这就是多语句版本可行的原因!这确实是Rust借用检查器的当前限制。有investigation ongoing可以查看是否可以取消某些类型的限制。

相关问题