2015-06-16 6 views
7

Próbuję zaimplementować cechę Iterator dla struktury, która działa jako pożyczkodawca tablicy wartości i32, ale wciąż pracuję nad kompilatorem narzekającym na nie być w stanie wnioskować o życiu w następnej metodzie.Nie można określić odpowiedniego czasu życia dla autoref podczas wywoływania metody z implementacji Iterator

Jestem świadomy Need help understanding Iterator lifetimes, ale ponieważ moja struktura po prostu pożycza kawałek tablicy tak czy inaczej, utrzymuję pamięć rzeczywistych elementów oddzielonych od mojego IntegerArrayBag.

#[derive(Debug)] 
struct IntegerArrayBag<'a> { 
    arr: &'a [i32], 
    idx: usize, 
} 

impl<'a> IntegerArrayBag<'a> { 
    fn len(&self) -> usize { 
     self.arr.len() 
    } 

    fn get(&self, idx: usize) -> Option<&i32> { 
     if self.arr.len() > idx { 
      Some(&self.arr[idx]) 
     } else { 
      None 
     } 
    } 
} 

impl<'a> Iterator for IntegerArrayBag<'a> { 
    type Item = &'a i32; 

    fn next(&mut self) -> Option<&'a i32> { 
     let idx = self.idx; 
     self.idx += 1; 
     self.get(idx) 
    } 
} 

Gdy próbuję skompilować this code, kompilator narzeka:

error[E0495]: cannot infer an appropriate lifetime for autoref due to conflicting requirements 
    --> src/main.rs:27:14 
    | 
27 |   self.get(idx) 
    |    ^^^ 
    | 
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 24:5... 
    --> src/main.rs:24:5 
    | 
24 |/ fn next(&mut self) -> Option<&'a i32> { 
25 | |   let idx = self.idx; 
26 | |   self.idx += 1; 
27 | |   self.get(idx) 
28 | |  } 
    | |_____^ 
note: ...so that reference does not outlive borrowed content 
    --> src/main.rs:27:9 
    | 
27 |   self.get(idx) 
    |   ^^^^ 
note: but, the lifetime must be valid for the lifetime 'a as defined on the impl at 21:1... 
    --> src/main.rs:21:1 
    | 
21 |/impl<'a> Iterator for IntegerArrayBag<'a> { 
22 | |  type Item = &'a i32; 
23 | | 
24 | |  fn next(&mut self) -> Option<&'a i32> { 
... | 
28 | |  } 
29 | | } 
    | |_^ 
note: ...so that expression is assignable (expected std::option::Option<&'a i32>, found std::option::Option<&i32>) 
    --> src/main.rs:27:9 
    | 
27 |   self.get(idx) 
    |   ^^^^^^^^^^^^^ 

Odpowiedz

6

Musisz zaktualizować swoją metodę get powrotu odwołanie z dłuższego życia:

// Use 'a from impl<'a> IntegerArrayBag<'a> 
fn get(&self, idx: usize) -> Option<&'a i32> { 

i wtedy będzie skompilować.

+0

Oczywiście. Jest oddzielony od siebie, więc muszę to również zadeklarować. Dzięki. –

Powiązane problemy