Rust 习惯地以可变和不变的方式访问向量的元素
如果需要对所述向量的不可变引用来确定需要如何对向量进行变异,您将如何以这种方式对向量进行变异?例如,我有一段代码看起来像这样,我想复制向量的最后一个元素:Rust 习惯地以可变和不变的方式访问向量的元素,rust,borrow-checker,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();
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);
让mut-vec:vec=vec![123, 42, 10];
//当然不行:
向量推送(*vec.last().unwrap())
//工作,但这是必要的吗?
设x=*vec.last().unwrap();
矢量推力(x);
不可变引用[…]以确定需要如何变异向量
简单的回答是你没有。对向量的任何变异都可能使所有现有引用无效,使任何未来的操作访问无效数据,从而可能导致SEGFULTS。安全生锈不允许这种可能性
您的第二个示例创建了向量中值的副本,因此它不再关心向量发生了什么;该值将继续有效
第一个例子的不幸之处在于,如果您按照操作顺序操作,人类可以在变异发生之前判断出已检索到不可变值。事实上,这就是为什么多语句版本是可能的!这确实是Rust borrow checker当前的一个限制。我们需要看看这些限制中的一些是否可以取消