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

Nic*_*lay 6 rust

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

认为这会起作用(通过增加引用计数),但我得到了一个“预期的结构std::rc::Rc,找到了引用”错误。

如何将 an 转换&Rc<Foo>为 a 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)
}
Run Code Online (Sandbox Code Playgroud)

我知道哈希映射返回对其拥有的值的引用。但是提领它不工作:既if let Some(&x)bar.push(*x);导致“无法动弹借来的内容了”

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

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

我需要存储对同一个对象的引用,而不是副本,所以我避免了.clone()“逃生舱口”。

Nic*_*lay 8

要转换&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);
Run Code Online (Sandbox Code Playgroud)

rc.clone()等价于Rc::clone(&rc),但惯用的 Rust 使用后者来表明代码只增加了引用计数,而不是像.clone()do 的其他一些实现那样执行数据的深度复制。(尽管在某些涉及特征的情况下,您可能需要恢复到ref_to_rc.clone()。)

上面的错误是关于 Rust 拒绝隐式复制。为什么 std::rc::Rc<> 不是 Copy?有一个解释为什么它会这样。