2014-11-15 2 views
3

나는 10 0 ~ 3을 곱한 출력이 코드를 작성수명이 새로운 매혹적인 언어를 배우는에서

struct Holder { 
    x : Iterator<int> 
} 

컴파일 경고 메시지가 표시됩니다.

<anon>:27:9: 27:22 error: explicit lifetime bound required 
<anon>:27  x : Iterator<int> 
        ^~~~~~~~~~~~~ 

필드 유형을 변경하면 명시적인 수명이 필요한 이유를 설명 할 수 있습니까? 나는 수명을 표시하는 방법을 알고 있지만 컴파일러가 왜 내가 이것을하기를 원하는지 모르겠습니다. 이 크기를 지정하지 않은 인 특성 객체를 포함하고 있기 때문에,이 방법으로는 Holder 구조체 크기를 지정하지 않은 것을 그러나

struct Holder<'a> { 
    x: Iterator<int>+'a 
} 

참고 :

답변

3

은이 방법을 결합 평생을 추가 할 수 있습니다. 이렇게하면 유형으로 할 수있는 일이 크게 제한됩니다. 예를 들어 Holder을 직접 반환 할 수 없습니다. 유형 매개 변수를 사용하는

struct Holder<T> where T: Iterator<int> { 
    x : T 
} 

하자의 변화 get_iterator :

수락 Holder함으로써 유형 매개 변수를이 문제를 해결할 수

impl<T> Holder<T> where T: Iterator<int>+Copy { 
    fn get_iterator(&self) -> T { 
     self.x 
    } 
} 

참고 : 나는 추가 여기에 있기 때문에 바인딩 Copyget_iterator은 현재 사본을 반환합니다. get_iterator&T을 반환하게함으로써 경계를 피할 수 있습니다.

new의 경우 완전히 재 설계해야합니다. 그대로 유지하면 Holder에 유형 매개 변수가 있으므로 Holder::new으로 호출하면 컴파일러에서 오류가 발생하고 new에는 아무 것도 사용하지 않으므로 컴파일러에서 유형을 유추 할 수 없습니다. 다음

trait FactorCtor { 
    fn new(factor: int) -> Self; 
} 

그리고 그 특성 사용 new을 변경 :

impl<T> Holder<T> where T: Iterator<int>+FactorCtor { 
    pub fn new(factor : int) -> Holder<T> { 
     Holder { 
      x : FactorCtor::new(factor) 
     } 
    } 
} 

우리가 FactorCtor의 한 구현을 가지고 있기 때문에 이것을 해결하기 위해, 우리는 생성자를 제공하는 특성을 사용하여 일반적인 new을 만들 수 있습니다 이 프로그램에서는 컴파일러가 Holder::new을 호출 할 때 T을 유추 할 수 있습니다. 다른 구현을 추가하면 (예 : Adder는 :

<anon>:72:9: 72:29 error: unable to infer enough type information about `_`; type annotations required 
<anon>:72  let mut three_multiplier = Holder::new(3).get_iterator(); 
        ^~~~~~~~~~~~~~~~~~~~ 

우리는 명시 적으로 T을 지정하여이 문제를 해결할 수 있습니다 :

fn main() { 
    let mut three_multiplier = Holder::<Multiplier>::new(3).get_iterator(); 
    for item in three_multiplier { 
     println!("{}", item); 
    } 
} 

pub struct Adder { 
    factor : int, 
    current : int 
} 
impl FactorCtor for Adder { 
    fn new(factor: int) -> Adder { 
     Adder { 
      factor: factor, 
      current: 0 
     } 
    } 
} 
impl Iterator<int> for Adder { 
    fn next(&mut self) -> Option<int> { 
     if self.current > 10 { 
      None 
     } 
     else { 
      let current = self.current; 
      self.current += 1; 
      Some(current + self.factor) 
     } 
    } 
} 

그런 다음 우리는 컴파일러 오류

관련 문제