问题描述
我一直在用“通过编写太多链表来学习 rust”的指导来试验 rust 中的数据结构,首先由我自己实现,然后像页面上说的那样。这样做时,我发现了一些奇怪的东西,与书上显示的相比,我对 List 删除的实现(否则需要它的尾递归)太慢了,我的直觉说它应该更快。
这里是List和Node的声明
type Link<T> = Option<Rc<Node<T>>>;
struct Node<T> {
value: T,next: Link<T>,}
struct List<T> {
head: Link<T>,}
impl<T> List<T> {
fn new() -> Self {
List { head: None }
}
fn append(&self,value: T) -> List<T> {
List { head: Some(Rc::new(Node {
value,next: self.head.clone()
}))}
}
fn tail(&self) -> List<T> {
List { head: self.head.as_ref().and_then(|node| node.next.clone()) }
}
}
我对 drop 的幼稚实现
我用 None 替换头部,然后将列表头部值设置为下一个,最后列表的所有节点都应为 None
impl<T> Drop for List<T> {
fn drop(&mut self) {
/* Slow one */
while let Some(node) = std::mem::replace(&mut self.head,None) {
self.head = node.next.clone();
}
}
}
页面的实现
它取链表的头部(留下一个None,droppable),并递归地取链表的所有节点
impl<T> Drop for List<T> {
fn drop(&mut self) {
/* Fast one */
let mut head = self.head.take();
while let Some(node) = head {
if let Ok(mut node) = Rc::try_unwrap(node) {
head = node.next.take();
} else {
break;
}
}
}
}
这是 Godbolt 链接 godbolt
有谁知道为什么会这样??在godbolt 链接中是main
,我在这里测试了列表的丢弃能力。
“我显然使用发布模式进行的所有测试”
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)