0

我正在尝试跟随Rust With Entirely Too Many Linked Lists

type Link<T> = Option<Box<Node<T>>>;

pub struct List<T> {
    head: Link<T>,
}

struct Node<T> {
    elem: T,
    next: Link<T>,
}

pub struct Iter<T> {
    next: Option<&Node<T>>,
}

实施iter时,

impl<'a, T> Iterator for Iter<'a, T> {
    type Item = &'a T;

    fn next(&mut self) -> Option<Self::Item> {
        self.next.map(|node| {
            self.next = node.next.as_ref().map(|node| &**node);
            &node.elem
        })
    }
}

在该next方法中,map采用Option按值,因此它需要采用self.next恰好是Option<&Node<T>>按值类型的。这不会“窃取”价值吗?

由于闭包是一个变异闭包,它不应该需要完全访问self并且这段代码不应该编译吗?我在这里错过了什么吗?

4

1 回答 1

1

这不会“窃取”价值吗?

它会,除了那Option<&T>是可复制的。因此self,保留一份并map获得另一份。

需要完全访问self

由于该值被复制到 中map,因此与 中的值没有任何联系self。因此self可以在闭包内替换 in 的值。

于 2017-12-24T15:34:25.730 回答