# Drop

像可变列表一样，我们有一个递归析构函数问题。 诚然，对于不可变的列表来说，这并不是一个问题：如果我们碰到了另一个节点，该节点是另一个列表的头部，则不会递归地删除它。 但是，这仍然是我们应该关注的事情，如何处理尚不清楚。 这是我们之前解决问题的方法：

```rust
impl<T> Drop for List<T> {
    fn drop(&mut self) {
        let mut cur_link = self.head.take();
        while let Some(mut boxed_node) = cur_link {
            cur_link = boxed_node.next.take();
        }
    }
}
```

问题在于循环的主体：

```rust
cur_link = boxed_node.next.take();
```

这是对 Box 内的 Node 进行修改，但是我们不能使用Rc来做到这一点。 它只为我们提供了共享访问权限，因为任何其他 Rc 都可以指向它。

但是，如果我们知道这个列表的最后一个节点，那么将节点移出 Rc 实际上是可以的。 然后我们还可以知道何时停止：每当我们无法调出节点时。

看看这个，Rc 有一个方法就是这样做的：try\_unwrap：

```rust
impl<T> Drop for List<T> {
    fn drop(&mut self) {
        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;
            }
        }
    }
}
```

```rust
cargo test
   Compiling lists v0.1.0 (/Users/ABeingessner/dev/too-many-lists/lists)
    Finished dev [unoptimized + debuginfo] target(s) in 1.10s
     Running /Users/ABeingessner/dev/too-many-lists/lists/target/debug/deps/lists-86544f1d97438f1f

running 8 tests
test first::test::basics ... ok
test second::test::basics ... ok
test second::test::into_iter ... ok
test second::test::iter ... ok
test second::test::iter_mut ... ok
test second::test::peek ... ok
test third::test::basics ... ok
test third::test::iter ... ok

test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
```

太好了!&#x20;
