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

Rust实现单链表display方法报错:临时值被提前丢弃

Rust单链表display方法中“temporary value dropped while borrowed”错误解决

错误原因

node.borrow()会生成一个临时的Ref对象,这个对象仅在当前表达式的生命周期内有效。当你执行current = &node.borrow().next时,试图引用临时Ref内部的next字段,但临时Ref在语句结束后就会被销毁,导致引用悬空,这就是编译器抛出该错误的核心原因。

解决代码

修改LnkdList的display方法,将borrow()返回的Ref对象保存下来,延长其生命周期:

pub fn display(&self) {
    let mut current = self.head.as_ref();

    while let Some(node) = current {
        let node_ref = node.borrow();
        println!("{:?}", node_ref.val);
        current = node_ref.next.as_ref();
    }
}

改动说明

  • 初始化current时,用self.head.as_ref()直接获取Option<Rc<RefCell<Node<T>>>>的引用,避免一开始持有双重引用,简化后续逻辑。
  • 循环内先调用node.borrow()得到Ref<Node<T>>并赋值给node_ref,这个变量的生命周期会持续到当前循环迭代结束,确保访问next字段时Ref仍有效。
  • 用node_ref.next.as_ref()将Option<Rc<...>>转换成Option<&Rc<...>>,让current能正确持有下一个节点的合法引用。

额外补充

原代码中add_front和add_back方法都没有更新size字段,导致size永远为0,建议补上:

pub fn add_front(&mut self, data: T) {
    let new_head = Node::new(data);
    match self.head.take() {
        Some(old_head) => {
            new_head.borrow_mut().next = Some(old_head);
            self.head = Some(new_head);
        }
        None => {
            self.tail = Some(new_head.clone());
            self.head = Some(new_head);
        }
    }
    self.size += 1;
}

pub fn add_back(&mut self, data: T) {
    let new_node = Node::new(data);
    match &self.tail {
        Some(node) => {
            node.borrow_mut().next = Some(new_node.clone());
            self.tail = Some(new_node)
        }
        None => {
            self.tail = Some(new_node.clone());
            self.head = Some(new_node);
        }
    }
    self.size += 1;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:37:07