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