Почему 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 можно заменить внутри крышки.

Другие вопросы по тегам