Rust中Rc<RefCell>二叉树插入节点报Cannot borrow as mutable错误如何解决
Rust二叉树节点赋值报错解决方案
报错原因
- 直接调用
unwrap()会消耗t.left的所有权,导致原节点的左子节点被置空,后续无法正常访问 Rc<RefCell<T>>结构中,Rc是共享所有权指针,不支持直接可变借用,你用到的get_mut()方法要求当前Rc是唯一持有对象才能生效,不适用于这种多所有权共享的二叉树场景,要修改RefCell包裹的内容应该调用borrow_mut()方法获取内部可变引用。
修正后的代码
fn main() { let mut t = TreeNode::new(1); t.left = Some(Rc::new(RefCell::new (TreeNode::new(2)))); t.right = Some(Rc::new(RefCell::new(TreeNode::new(3)))); // 修正后的赋值语句 t.left.as_ref().unwrap().borrow_mut().left = Some(Rc::new(RefCell::new(TreeNode::new(4)))); // 打印验证结构符合预期 println!("{:#?}", t); }
代码说明
as_ref():将Option<Rc<RefCell<TreeNode>>>转换为Option<&Rc<RefCell<TreeNode>>>,避免unwrap()消耗原节点的所有权borrow_mut():通过RefCell的内部可变性特性,合法获取包裹的TreeNode的可变引用,完成左子节点赋值,完全符合现有字段类型要求,不需要修改节点结构定义
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

