为什么Option :: map在Iterator :: next的链表实现中取得所有权?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么Option :: map在Iterator :: next的链表实现中取得所有权?相关的知识,希望对你有一定的参考价值。

我想跟随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>>,
}

implementing a 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并且这段代码不应该编译?我在这里错过了什么吗?

答案

难道不会“偷”价值吗?

它会,但Option<&T>是可复制的。因此,self保留一份,map得到另一份。

需要完全访问self

由于该值被复制到map中,因此与self中的值无关。因此,self中的值可以在闭包内替换。

以上是关于为什么Option :: map在Iterator :: next的链表实现中取得所有权?的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL中的 iterator 和 const_iterator

Scala Option[String] map 变成 Iterable

理解ES6中的Iterator

unordered_map::iterator->first 的地址是不是会在后续插入和删除时发生变化? [复制]

Angular:找不到 Promise、Map、Set 和 Iterator

leetcode 389 map iterator 的使用