惯用地可变和不可变地访问向量的元素
Idiomatically access an element of a vector mutably and immutably
如果您需要对所述向量的不可变引用来确定需要如何改变向量,您将如何以这种方式改变向量?例如,我有一段代码看起来像这样,我想复制向量的最后一个元素:
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?
简短的回答是你不知道。向量的任何变化都可能 可能 使所有现有引用无效,使任何未来的操作访问无效数据,可能导致段错误。 Safe Rust 不允许这种可能性。
您的第二个示例创建了向量中值的副本,因此向量发生什么不再重要;该值将继续有效。
第一个示例的不幸之处在于,如果您遵循操作顺序,人们可以判断出不可变值是在突变发生之前检索到的。事实上,这就是多语句版本完全可行的原因!这确实是 Rust 借用检查器的当前限制。 investigation ongoing 看看是否可以取消其中一些类型的限制。
如果您需要对所述向量的不可变引用来确定需要如何改变向量,您将如何以这种方式改变向量?例如,我有一段代码看起来像这样,我想复制向量的最后一个元素:
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?
简短的回答是你不知道。向量的任何变化都可能 可能 使所有现有引用无效,使任何未来的操作访问无效数据,可能导致段错误。 Safe Rust 不允许这种可能性。
您的第二个示例创建了向量中值的副本,因此向量发生什么不再重要;该值将继续有效。
第一个示例的不幸之处在于,如果您遵循操作顺序,人们可以判断出不可变值是在突变发生之前检索到的。事实上,这就是多语句版本完全可行的原因!这确实是 Rust 借用检查器的当前限制。 investigation ongoing 看看是否可以取消其中一些类型的限制。