首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“预期结构` `std::rc::Rc`,查找引用”--如何转换?

“预期结构` `std::rc::Rc`,查找引用”--如何转换?
EN

Stack Overflow用户
提问于 2019-03-10 01:44:34
回答 1查看 5K关注 0票数 8

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

我认为这是可行的(通过增加引用计数),但是我得到了一个“预期的struct查找引用”**错误。

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

更多信息:

代码语言:javascript
复制
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);都会导致“不能从借来的内容中移出”

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

代码语言:javascript
复制
    let x : &Rc<Foo> = x;
    bar.push(*x); // cannot move out of an `Rc`  rustc(E0507)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-10 01:44:34

要转换&Rc<Foo> -> Rc<Foo>,请使用Rc::clone(),它为您提供了自己的Rc对象,增加了引擎盖下的引用计数:

代码语言:javascript
复制
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()实现那样执行数据的深拷贝。( .)

上面的错误是关于Rust拒绝隐式地复制。Why is std::rc::Rc<> not Copy?解释了为什么它会这样做。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55083714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档