Почему Option::map не становится владельцем реализации связанного списка Iterator::next?
Я пытаюсь проследить за Rust, используя слишком много связанных списков.
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
и этот код не должен компилироваться? Я что-то здесь упускаю?
1 ответ
Разве это не "украдет" ценность?
Это было бы, за исключением того, что Option<&T>
копируемый таким образом self
держит одну копию и map
получает другое.
нужен полный доступ к
self
Поскольку значение копируется в map
нет связи с тем, кто в self
, Таким образом, значение в self
можно заменить внутри крышки.