我正在学习《用过多的链表学习 Rust》这本书,并且对该书中初始链表的 drop 实现有疑问。该链表由一个堆栈分配的 link 组成,该 link 可能为空,也可能指向一个带有一些关联数据的堆分配的 Node。
这本书中给出的drop trait实现使用
我很困惑为什么这本书使用
我编写了这个替代实现,它可以成功编译。我想知道两种drop方法之间是否有任何区别。
struct List {
head: Link,
}
enum Link {
Empty,
More(Box<Node>),
}
struct Node {
data: i32,
next: Link,
}
这本书中给出的drop trait实现使用
std::mem::replace
来获取列表中节点的所有权。// Copied from the book, omitting comments
impl Drop for List {
fn drop(&mut self) {
let mut cur_link = mem::replace(&mut self.head, Link::Empty);
while let Link::More(mut boxed_node) = cur_link {
cur_link = mem::replace(&mut boxed_node.next, Link::Empty);
}
}
}
我很困惑为什么这本书使用
mem::replace
来获取节点的下一个指针的所有权。似乎我们已经从while let
行拥有了boxed_node
的所有权,我们可以直接将cur_link
设置为node.next
而不是使用mem::replace
。我编写了这个替代实现,它可以成功编译。我想知道两种drop方法之间是否有任何区别。
impl Drop for List {
fn drop(&mut self) {
let mut link = mem::replace(&mut self.head, Link::Empty);
while let Link::More(node) = link {
link = node.next;
}
}
}
impl Drop for Node
,这可以在原始代码中工作,但不能在你的更改中使用(playground)。然而,在github
的 history 中似乎一直是这样的。 - rodrigoi32
进行了优化,那么我不会感到惊讶。 - apetranzilla