gpt4 book ai didi

rust - "expected struct ` std::rc::Rc `, found reference"- 如何转换?

转载 作者:行者123 更新时间:2023-11-29 07:59:21 24 4
gpt4 key购买 nike

我试图获得引用计数 Rc<Foo>从 HashMap 并将其放入不同的容器 ( Vec<Foo> )。

原以为这会起作用(通过增加引用计数),但我却收到了一个“expected struct std::rc::Rc , found reference”错误。

如何转换 &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)
}

我知道 HashMap 返回一个引用 到它拥有的值。但是取消引用它不起作用: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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com