我试图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()“逃生舱口”。
要转换&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?有一个解释为什么它会这样。
| 归档时间: |
|
| 查看次数: |
2741 次 |
| 最近记录: |