rust 将装箱值从一个Vec移动到另一个Vec [重复]

yrdbyhpb  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(134)

此问题已在此处有答案

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,理想情况下我会避免这种情况。当v1Map到v2时,它会被有效地消耗。
如上所示,这个例子很无趣,在“真实的”的情况下,v1是一个2元组的Vec,我想把它Map到一个3元组的Vec,并从前两个元组派生一个额外的元素。
我知道我不需要所有的类型注解,但这有助于检查我得到了我想要的东西。有一段时间我认为我已经成功了,但实际上得到了一个Vec<&Box<B>>(或类似的,不要相信我的确切说法)。
有没有人有任何见解,如何做到这一点,或者我如何可以处理不同的问题?谢谢!

7ajki6be

7ajki6be1#

如果你想 * 消耗 * 原始向量,你想要into_iter而不是iter,它只给你共享引用:

let v1: Vec<_> = (1..3).map(|i| Box::new(B{ value: i})).collect();
let v2: Vec<Box<B>> = v1.into_iter().collect();

相关问题