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
相关产品推荐
相关产品推荐

