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);
}
}