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

时间:2017-12-24 15:21:24

标签: 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方法中,mapOption取值,因此需要 按值self.nextOption<&Node<T>>类型self。难道不会“偷”价值吗?

由于闭包是一个变异的,它不应该需要完全访问fileOperations([fileCopyOperation(excludes: '', flattenFiles: false, includes: "videos\\*.MTS", targetLocation: "H:\\home\\Videos")]) 并且这段代码不应该编译吗?我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

  

不会&#34;窃取&#34;价值?

除了Option<&T>是可复制的外,它会。因此self保留一份副本,map保留另一份副本。

  

需要完全访问self

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