为什么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>>,
}
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
unordered_map::iterator->first 的地址是不是会在后续插入和删除时发生变化? [复制]