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);
4

1 回答 1

4

不可变参考 [...] 来确定您需要如何改变向量?

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

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

第一个示例的不幸之处在于,如果您遵循操作顺序,人类可以判断在突变发生之前检索了不可变值。事实上,这就是为什么多语句版本是可能的!这确实是 Rust 借用检查器的当前限制。正在进行调查,以确定是否可以取消其中一些类型的限制。

于 2016-02-22T02:40:45.327 回答