2017-12-24 36 views
0

私はRust With Entirely Too Many Linked Listsをフォローしようとしています。Option :: mapがIterator :: nextのリンクリストの実装で所有権を取得しないのはなぜですか?

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>>, 
} 

値によってタイプOption<&Node<T>>であることを起こるself.nextを取ることが必要になるので、implementing a iterが、next方法において

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 
     }) 
    } 
} 

は、map値によってOptionをとります。それは価値を「盗む」だろうか?

閉鎖が変異一つであるため、それはselfへの完全なアクセスを必要はありませんし、このコードはコンパイルしないでしょうか?私はここに何かを逃していますか

+0

お読みください。あなたが見ているコードの全目的は、とにかく*表示されるかもしれない多くのエラーを提示することです。貼り付けたコードはコンパイルされません。 – Shepmaster

答えて

0

値を "盗む" ことではないでしょうか?

ただし、Option<&T>はコピー可能です。したがって、selfは1つのコピーを保持し、mapは別のコピーを取得します。

値がmapにコピーされているのでself

への完全なアクセスを必要とする、self中1への接続はありません。したがって、selfの値はクロージャ内で置き換えることができます。

関連する問題