我已经实现了rust中的链表程序,下面是Node结构和LnkdList结构。但是当我在LnkdList结构中实现显示方法时,我在current = &node.borrow().next. while循环中得到一个错误,它告诉->临时值在借用时丢失
下面是链表的代码
use std::cell::RefCell;
use std::rc::Rc;
struct Node<T> {
val: T,
next: Option<Rc<RefCell<Node<T>>>>,
}
impl<T: std::fmt::Debug> Node<T> {
fn new(elem: T) -> Rc<RefCell<Self>> {
Rc::new(RefCell::new(Node {
val: elem,
next: None,
}))
}
}
pub struct LnkdList<T> {
head: Option<Rc<RefCell<Node<T>>>>,
tail: Option<Rc<RefCell<Node<T>>>>,
size: i32,
}
impl<T: std::fmt::Debug> LnkdList<T> {
pub fn new() -> Self {
LnkdList {
head: None,
tail: None,
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);
}
node => {
self.tail = Some(new_head.clone());
self.head = Some(new_head);
}
}
}
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);
}
}
}
pub fn display(&self) {
let mut current = &self.head;
while let Some(node) = current {
println!("{:?}", node.borrow().val);
current = &node.borrow().next;
}
}
}
我已经实现了LnkdList程序如下
fn main() {
let mut list = lnkd_list::LnkdList::new();
list.add_front(1);
list.add_front(23);
list.display();
}
我希望输出应该是23,1,但显示方法是抛出错误,如上所述
1条答案
按热度按时间h5qlskok1#
这个错误的解决方案相当简单。该错误表明您在使用
RefCell
时不能卸下它的防护。但是因为它是一个Rc
,你可以克隆它: