gpt4 book ai didi

rust - 如何从向量中克隆最后一个元素?

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

我正在尝试编写代码来获取某个向量的最后一个元素,并根据该元素执行不同的操作(包括向量的变异)。

我试过这样的:

#[derive(Clone, PartialEq)]
enum ParseItem {
Start,
End,
}

let mut item_vec = vec![ParseItem::End];
loop {
let last_item = *item_vec.last().clone().unwrap();
match last_item {
ParseItem::End => item_vec.push(ParseItem::Start),
_ => break,
}
}

我收到以下错误:

error: cannot move out of borrowed content
let last_item = *item_vec.last().clone().unwrap();

我认为通过克隆 item_vec.last(),所有权问题会得到解决,但似乎没有。

如果我用这样的整数向量尝试同样的事情:

let mut int_vec = vec![0];
loop {
let last_int = *int_vec.last().clone().unwrap();
match last_int {
0 => int_vec.push(1),
_ => break,
}
}

编译器不会提示借用。

为什么我的代码无法编译?

最佳答案

item_vec.last()是一个 Option<&T> .

item_vec.last().clone()是另一个Option<&T> .这实际上执行了引用的 副本。这意味着您实际上没有修复任何东西!

直觉上,这是有道理的——克隆一个指针可以返回一个值类型直接存储在栈上,但是一个 Option<&T> 的克隆不能克隆 T因为它无处可放。

之所以有效,是因为 Option<T>实际上调用clone&T 上, 所以 Option<&T>电话 clone&&T 上,这意味着 &self特征中的参数解析为 self = &T .这意味着我们使用 the impl of Clone for &T :

impl<'a, T: ?Sized> Clone for &'a T {
/// Returns a shallow copy of the reference.
#[inline]
fn clone(&self) -> &'a T { *self }
}

*item_vec.last().clone().unwrap()因此仍然是向量的借用。

可以通过两种基本方法解决此问题。一种是使用 Option 's cloned method ,它克隆了内部引用:

item_vec.last().cloned().unwrap()

This is implemented as a map on the internal data:

impl<'a, T: Clone> Option<&'a T> {
/// Maps an Option<&T> to an Option<T> by cloning the contents of the Option.
#[stable(feature = "rust1", since = "1.0.0")]
pub fn cloned(self) -> Option<T> {
self.map(|t| t.clone())
}
}

另一个选项是unwrap并且只有然后 clone引用,得到一个值:

item_vec.last().unwrap().clone()

关于rust - 如何从向量中克隆最后一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31907887/

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