我目前有一个Vec<Rc<Item>>
,非常希望有一个Vec<Item>
,其中每个Rc项都克隆到新的Vec中。我该怎么做?
答案 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);
}