从引用的Vec克隆计数到对象的Vec

时间:2018-10-18 16:54:32

标签: rust

我目前有一个Vec<Rc<Item>>,非常希望有一个Vec<Item>,其中每个Rc项都克隆到新的Vec中。我该怎么做?

2 个答案:

答案 0 :(得分:3)

您可以为此使用通常的iter().map(...).collect()模式。在地图内部,您需要通过先解除引用然后调用Rc来创建clone()内部项目的副本:

let v: Vec<_> = (0..10).map(|_| Rc::new(String::from("a"))).collect();
let v: Vec<_> = v.iter().map(|s| (**s).clone()).collect();

闭包中s的类型为&Rc<String>。通过一次取消引用,您将获得Rc<String>。通过再次取消引用,您将获得String。对该字符串进行隐式重新借用以调用clone(),该调用返回该字符串的副本。

答案 1 :(得分:1)

如果要避免克隆任何东西,并且对数组中的每个值只有一个引用,则只需解开Rc s:

use std::rc::Rc;

fn main() {
    let strs = vec![Rc::new("aghaj".to_string()); 7];

    println!("{:?}", strs);

    let unwrapped: Vec<_> = strs
        .into_iter()
        .map(|x| Rc::try_unwrap(x).unwrap())
        .collect();

    println!("{:?}", unwrapped);
}