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

标签 reference rust closures ownership-semantics

我正在尝试跟进 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按值(value),所以它需要 拿self.next恰好是 Option<&Node<T>> 类型按值(value)。那不会“窃取”值(value)吗?

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

最佳答案

Wouldn't that "steal" the value?

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

need complete access to self

由于值被复制到 map 中, 与 self 中的那个没有联系.因此 self 中的值可以在封闭物内更换。

关于reference - 为什么 Option::map 不在 Iterator::next 的链表实现中取得所有权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47961805/

相关文章:

ios - 改变不同变量的动画回调

swift - 将 FIRDataSnapshot 转换为自定义类型

Java 方法与引用性能

C++通过引用传递动态分配的二维数组

rust - 何时取消引用可变引用的行为令人困惑

multithreading - 如何在线程中改变 self ?

javascript - 为什么我无法使用点语法访问返回的函数

c++ - : Handle, 指针和引用有什么区别

c++ - 引用成员是好的做法吗?是常量成员吗?

rust - 在关联类型和迭代器的上下文中需要类型注释