Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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 vector: Vec<i32> = Vec::new(); if let Some(last_value) = vector.last() { vector.push(*last_value + 1); } 在非词汇生命周期之后,什么是一个好方法 您的原始代码,它支持: 这里,我使用了模式Some(&last\u值)而不是S

我想得到向量的最后一个元素,并用它来确定下一个要推入的元素。下面是一个示例,说明了它如何不起作用,但它显示了我正在努力实现的目标:

let mut vector: Vec<i32> = Vec::new();

if let Some(last_value) = vector.last() {
    vector.push(*last_value + 1);
}
在非词汇生命周期之后,什么是一个好方法 您的原始代码,它支持:

这里,我使用了模式
Some(&last\u值)
而不是
Some(last\u值)
。这将分解引用并强制创建副本。如果使用不可复制的类型尝试此模式,则会出现编译器错误:

错误[E0507]:无法移出借用的内容
-->src/main.rs:4:17
|
4 |如果让一些(&last_值)=vector.last(){
|                 ^----------
|                 ||
||提示:要防止移动,请使用'ref last_value'或'ref mut last_value'`
|无法移出借用的内容
如果向量不包含
Copy
able类型,则可能需要首先克隆值:

fn main() {
    let mut vector: Vec<String> = Vec::new();

    if let Some(last_value) = vector.last().cloned() {
        vector.push(last_value + "abc");
    }
}

你能解释一下你的第一个例子与OP的代码相比吗?它到底有什么不同?复制在哪里发挥作用?@JimmyCuadra在OP的代码
last\u value()
中与
last\u value
匹配。因为
last\u value()
返回一个引用,
last\u value
也成为一个引用。但是,Francis将模式更改为
&last\u value
,因此该引用匹配
&
,而值本身匹配
last\u value
,因此按值复制。这称为解构。
fn main() {
    let mut vector: Vec<i32> = Vec::new();

    if let Some(&last_value) = vector.last() {
        vector.push(last_value + 1);
    }
}
fn main() {
    let mut vector: Vec<String> = Vec::new();

    if let Some(last_value) = vector.last().cloned() {
        vector.push(last_value + "abc");
    }
}
fn main() {
    let mut vector: Vec<String> = Vec::new();

    if let Some(last_value) = vector.last().map(|v| v.len().to_string()) {
        vector.push(last_value);
    }
}