Rust中如何复制Rc<RefCell<SomeStruct>>内部的SomeStruct值
错误原因
你当前代码无法编译的核心逻辑是:Rc<RefCell<T>> 属于共享所有权智能指针组合,内部的值可能被多个所有者共同持有,Rust不允许你直接将值从RefCell中移动走,否则其他所有者会访问到无效数据。
你调用borrow_mut()得到的是RefMut<T>借用守卫,对它解引用只能拿到T的可变借用,无法直接获取所有权。
正确实现方案
首先需要为SomeStruct实现Clone trait,之后修改代码如下:
impl GameTree { pub fn new(rc_status: Rc<RefCell<SomeStruct>>) -> GameTree { // 先获取内部值的不可变借用,调用clone复制出完全独立的SomeStruct实例 let status: SomeStruct = rc_status.borrow().clone(); let root = Node::new(status); GameTree { root } } }
补充说明
- 如果你的
SomeStruct的所有字段都支持按位复制,你可以为它实现Copytrait,此时直接写let status: SomeStruct = *rc_status.borrow();就可以直接拷贝出独立实例,不需要显式调用clone。 - 你只是需要读取内部值做复制,不需要用
borrow_mut获取可变借用,用不可变的borrow即可,可以避免不必要的独占锁,降低和其他地方的借用发生冲突的概率。
内容的提问来源于stack exchange,提问作者Emilio Filippi
相关产品推荐
相关产品推荐

