2017-12-24 6 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은 하나의 사본을 보관하고 map은 다른 사본을 유지합니다. 값이 map에 복사되기 때문에

self

에 대한 완전한 액세스를 필요로 self에있는 것과 아무런 관련이 없습니다. 따라서 self의 값은 클로저 내부에서 대체 될 수 있습니다.

관련 문제