Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 习惯地以可变和不变的方式访问向量的元素_Rust_Borrow Checker - Fatal编程技术网

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当前的一个限制。我们需要看看这些限制中的一些是否可以取消