我正在跟踪从这个book开始的链表实现.
List
和Node
struct 是这样的-
type Link<T> = Option<Rc<RefCell<Node<T>>>>;
#[derive(Debug)]
pub struct List<T> {
head: Link<T>,
tail: Link<T>,
}
#[derive(Debug)]
struct Node<T> {
elem: T,
next: Link<T>,
prev: Link<T>,
}
我有一个类似下面的push_front
%的方法-
pub fn push_front(&mut self, elem: T) {
let new_node = Node::new(elem);
let new_node = Rc::new(RefCell::new(new_node));
let mut old_head = self.head.take();
old_head.as_mut().map(|node| {
node.borrow_mut().prev = Some(Rc::clone(&new_node));
});
new_node.borrow_mut().next = old_head.clone();
self.head = Some(new_node);
if self.tail.is_none() {
self.tail = self.head.clone();
}
}
代码编译得很好.但是,每当我在测试中放置调试印记List
时,我都会收到一条测试失败的消息thread 'tests::test_list_1' has overflowed its stack
.
#[test]
fn test_list_1() {
let mut list = List::new();
list.push_front(1);
list.push_front(2);
list.push_front(3);
println!("{:?}", list);
// assert!(false);
}
如果我注释掉println!
行,则测试通过.因此,基本上list
的调试打印导致了这里的堆栈溢出.我不能确切地理解为什么.
Playground Link个完整的代码.
我已经对代码进行了试验,以找出具体是下面一行代码导致的问题.
println!("{:?}", list);
所以我猜想,因为list
有一个std::rc::Rc
类型,而println!
宏引用了这个值,它以某种方式在某个地方创造了一个循环.不过,我不能明确指出问题所在.