You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中Option<Rc<RefCell<TreeNode>>>解引用问题及代码修复请求

修复Rust遍历父节点时的临时值生命周期错误

你的代码触发E0716错误的核心原因是:p.borrow()返回的Ref<TreeNode>是临时值,语句执行结束后就会被销毁,但你试图将它内部parent的引用赋值给curr,导致引用指向了已释放的对象,违反了Rust的生命周期安全规则。

修复后的完整代码

use std::{cell::RefCell, rc::Rc};

pub struct TreeNode {
    pub value: i32,
    pub parent: Option<Rc<RefCell<TreeNode>>>,
}

impl TreeNode {
    pub fn check(&self, val: i32) -> bool {
        let mut curr = self.parent.as_ref();
        while let Some(p) = curr {
            // 将borrow的结果绑定到变量,延长生命周期至循环块内
            let node_ref = p.borrow();
            if val == node_ref.value {
                return true;
            }
            // 从存活的node_ref中获取父节点引用
            curr = node_ref.parent.as_ref();
        }
        false
    }
}

pub fn main() {
    let node1 = TreeNode {
        value: 1,
        parent: None,
    };
    let boxed_node1 = Rc::new(RefCell::new(node1));

    let node2 = TreeNode {
        value: 2,
        parent: Some(boxed_node1.clone()),
    };
    let boxed_node2 = Rc::new(RefCell::new(node2));
    
    let result = boxed_node2.borrow().check(42);
    println!("result = {result}"); // 输出 result = false
    
    // 验证存在目标值的场景
    let result_exists = boxed_node2.borrow().check(1);
    println!("result_exists = {result_exists}"); // 输出 result_exists = true
}

关键修复点说明

  1. 延长临时值生命周期:将p.borrow()的结果绑定到node_ref变量,让Ref<TreeNode>的生命周期覆盖整个循环迭代,确保后续访问node_ref.parent时,借用仍然有效。
  2. 使用as_ref()获取引用:通过as_ref()将Option<Rc<RefCell<TreeNode>>>转换为Option<&Rc<RefCell<TreeNode>>>,避免转移所有权,仅持有引用完成遍历。
  3. 简化返回逻辑:Rust支持末尾表达式自动返回,直接返回false比return false更符合惯用写法。

内容的提问来源于stack exchange,提问作者brox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 13:23:15