“预期的结构`std :: rc :: Rc`,找到参考”-如何转换?

时间:2019-03-10 01:44:35

标签: rust

我试图从哈希图中获取引用计数的Rc<Foo>并将其放入另一个容器(Vec<Foo>)。

这样可以解决问题(通过增加引用计数),但是我收到了“预期结构std::rc::Rc,找到了引用” 错误。

如何将&Rc<Foo>转换为Rc<Foo>


更多信息:

struct Foo();
let mut foo : HashMap<usize, Rc<Foo>> = HashMap::new();
let mut bar : Vec<Rc<Foo>> = Vec::new();
foo.insert(0, Rc::new(Foo()));
if let Some(x) = foo.get(&0) {
    bar.push(x); // expected struct `std::rc::Rc`, found reference
                 // note: expected type `std::rc::Rc<Foo>`
                 //          found type `&std::rc::Rc<Foo>`  rustc(E0308)
}

我得到哈希表返回对其拥有的值的 reference 。但是取消引用是行不通的:if let Some(&x)bar.push(*x);都导致“无法移出借用的内容”

奇怪的是,添加类型注释会将错误更改为“无法移出Rc

    let x : &Rc<Foo> = x;
    bar.push(*x); // cannot move out of an `Rc`  rustc(E0507)

我需要存储对同一对象的引用,而不是对副本的引用,因此避免了.clone()“转义阴影”。

1 个答案:

答案 0 :(得分:2)

要转换&Rc<Foo>-> Rc<Foo>,请使用Rc::clone(),它会为您提供一个自己的Rc对象,从而增加了内部的引用计数:

let ref_to_rc: &Rc<Foo> = &Rc::new(Foo());
let new_rc: Rc<Foo> = Rc::clone(ref_to_rc);

rc.clone()等效于Rc::clone(&rc),但是惯用的Rust使用后者来表明代码仅增加引用计数,而不像其他一些实现那样执行数据的深层复制.clone()个。 (Though in some scenarios involving traits you might need to revert to ref_to_rc.clone()。)

以上错误与Rust拒绝隐式复制有关。 Why is std::rc::Rc<> not Copy?解释了为什么会这样。