gpt4 book ai didi

vector - 获取向量的最后一个元素并将其推送到同一个向量

转载 作者:行者123 更新时间:2023-11-29 07:52:29 26 4
gpt4 key购买 nike

我正在尝试做的事情:

enum Test {
Value1,
Value2,
Value3
}

fn main() {
let mut test_vec: Vec<Test> = Vec::new();
test_vec.push(Test::Value2);

if let Some(last) = test_vec.last() {
test_vec.push(*last);
}
//Wanted output: vector with [Test::Value2, Test::Value2]
}

我知道当我调用 last() ,它将返回 Option<&Test>所以它会借用test_vec直到 if-let block 结束。

我尝试了以下但没有成功:

if let Some(last) = test_vec.last().map(|v| v.clone()) {
test_vec.push(*last);
}

//and

let last = test_vec.last().unwrap().clone();
test_vec.push(*last);

最佳答案

当试图找出借用检查器提示的原因时,识别所涉及的类型可能很有用。

如果你输入:

let _: () = test_vec.last().map(|v| v.clone());

你得到一个错误提示 ()core::option::Option<&Test>不是同一类型。

这是怎么回事?很简单地说,如果你克隆一个 &Test你得到一个&Test ,因此调用 .map(|v| v.clone())Option<&Test> 上给出 Option<&Test> .显然,还是借用。

如果您输入以下内容,则下次尝试时会出现同样的问题:

let _: () = test_vec.last().unwrap().clone();

你得到一个错误提示 ()&Test不是同一类型。

调用 unwrapOption<&Test> 上你得到一个&Test然后将其克隆到 &Test 中.


所以,问题是缺少取消引用。您需要提前取消引用,以避免借用 test_vecSome(last) :

if let Some(last) = test_vec.last().map(|v| (*v).clone()) {
test_vec.push(last);
}

当然,这是行不通的,因为Test不执行 clone .一旦修复(通过 #[derive(Clone)] ),它就会编译。

由于从引用中克隆是一种常见的需求,因此 Option 上有一个专门的方法(和 Iterator )称为 cloned :

if let Some(last) = test_vec.last().cloned() {
test_vec.push(last);
}

关于vector - 获取向量的最后一个元素并将其推送到同一个向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37579949/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com