此问题已在此处有答案:
What is the difference between iter and into_iter?(5个答案)
5天前关闭。
我想将一些Box
艾德值从一个Vec
移动到另一个Vec
,但我不知道这是否可能,或者我是否想错了。
到目前为止,我最小的问题例子是:
#[derive(Debug)]
pub struct B {
value: usize
}
fn main() {
let v1: Vec<_> = (1..3).map(|i| Box::new(B{ value: i})).collect();
let v2: Vec<Box<B>> = v1.iter().map(|b| *b).collect();
println!("{v2:?}");
}
这给出了误差:
error[E0507]: cannot move out of `*b` which is behind a shared reference
--> src/main.rs:8:45
|
8 | let v2: Vec<Box<B>> = v1.iter().map(|b| *b).collect();
| ^^ move occurs because `*b` has type `Box<B>`, which does not implement the `Copy` trait
我尝试了各种(但可能不正确)的方法,试图移动与std::mem::swap
和朋友的盒子的内容,但还没有设法得到正确的。
为了清楚起见,我想避免复制B
--实际上它们很大。我还没有尝试过Rc
,理想情况下我会避免这种情况。当v1
Map到v2
时,它会被有效地消耗。
如上所示,这个例子很无趣,在“真实的”的情况下,v1
是一个2元组的Vec
,我想把它Map到一个3元组的Vec
,并从前两个元组派生一个额外的元素。
我知道我不需要所有的类型注解,但这有助于检查我得到了我想要的东西。有一段时间我认为我已经成功了,但实际上得到了一个Vec<&Box<B>>
(或类似的,不要相信我的确切说法)。
有没有人有任何见解,如何做到这一点,或者我如何可以处理不同的问题?谢谢!
1条答案
按热度按时间7ajki6be1#
如果你想 * 消耗 * 原始向量,你想要
into_iter
而不是iter
,它只给你共享引用: