2016-03-22 10 views
3
struct Person<T> { 
    letter: Letter<T> 
} 

struct Letter<T> { 
    words: [Option<T>; 5] 
} 

struct EditIter<'a, T: 'a> { 
    letter: &'a mut Letter<T> 
} 
impl<'a, T: 'a> Iterator for EditIter<'a, T> { 
    type Item = Mode<'a, T>; 
    fn next(&mut self) -> Option<Self::Item> { 
     /* ... */ 
     Some(Mode::Editing(self.letter)) 
    } 
} 

enum Mode<'a, T: 'a> { 
    Editing(&'a Letter<T>), 
    Speaking(&'a Letter<T>) 
} 

Fehler:Lebensdauer in Iterator: fn nächste (& 'ein mut selbst)

src/temp.rs:16:28: 16:39 error: cannot infer an appropriate lifetime for automatic coercion due to conflicting requirements [E0495] 
src/temp.rs:16   Some(Mode::Editing(self.letter)) 
              ^~~~~~~~~~~ 
src/temp.rs:14:5: 17:6 help: consider using an explicit lifetime parameter as shown: fn next(&'a mut self) -> Option<Self::Item> 
src/temp.rs:14  fn next(&mut self) -> Option<Self::Item> { 
src/temp.rs:15   /* ... */ 
src/temp.rs:16   Some(Mode::Editing(self.letter)) 
src/temp.rs:17  } 

Person Eigentümerin der Letter, Person Transfers ein veränderliches borrow von Letter zu EditIter schafft EditIter eine Mode mit dem geliehenen Letter und sendet es. Wenn Sie das Merkmal Iterator entfernen und wie in der Fehlermeldung beschrieben, funktioniert es, aber das würde nicht die Iterator Eigenschaft implementieren.

Wie kann ich die Logik speichern und den Fehler beheben?

Antwort

1

Da Ihr Mode hat keine Notwendigkeit für eine veränderbare Referenz, entfernen Sie die mut von EditIter und es wird funktionieren:

struct Person<T> { 
    letter: Letter<T>, 
} 

struct Letter<T> { 
    words: [Option<T>; 5], 
} 

struct EditIter<'a, T: 'a> { 
    letter: &'a Letter<T>, 
} 

impl<'a, T: 'a> Iterator for EditIter<'a, T> { 
    type Item = Mode<'a, T>; 

    fn next(&mut self) -> Option<Self::Item> { 
     Some(Mode::Editing(self.letter)) 
    } 
} 

enum Mode<'a, T: 'a> { 
    Editing(&'a Letter<T>), 
    Speaking(&'a Letter<T>), 
} 
+0

** 'EditIter' sollte die' Letter' ändern können. (zB 'words'). **' Mode' - Komponente der externen API. Der "Brief" hat einige öffentliche Methoden. – nujemid

+0

@nujemid Ich bin mir nicht sicher, was ich dir sagen soll. Basierend auf dem [MCVE] (/ help/mcve) und beschreibendem Text, den Sie in der Frage angegeben haben, kompiliert der Code und läuft mit den Änderungen, die ich gemacht habe. – Shepmaster

+0

Aber verlorene Logik. – nujemid