上一章节中我们讲到了要为 List 实现三种类型的迭代器并实现了其中两种: IntoIter 和 Iter。下面再来看看最后一种 IterMut。

再来回顾下 Iter 的实现:

可以看出 next 方法的输入和输出之间的生命周期并没有关联,这样我们就可以无条件的一遍又一遍地调用 next:

对于不可变借用而言,这种方式没有任何问题,因为不可变借用可以同时存在多个,但是如果是可变引用呢?因此,大家可能会以为使用安全代码来写 IterMut 是一件相当困难的事。但是令人诧异的是,事实上,我们可以使用安全的代码来为很多数据结构实现 IterMut。

果不其然,两个错误发生了。第一错误看上去很清晰,甚至告诉了我们该如何解决:

但是另一个好像就没那么容易了。但是之前的代码就可以工作啊,为何这里就不行了?

原因在于有些类型可以 Copy,有些不行。因此我们需要使用 take 方法来处理这种情况:

最终,我们完成了迭代器的功能,下面是完整的代码。