我试图从哈希图中获取引用计数的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)
}
我知道哈希映射返回对其拥有的值的引用。但是取消引用是行不通的:
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()
“转义阴影”。 最佳答案
要转换&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?解释了为什么会这样。
关于rust - "expected struct ` std::rc::Rc `, found reference"-如何转换?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55083714/