2016-03-22 6 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>) 
} 

エラー:寿命:fnを次の(& 'MUT自己)

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  } 

PersonLetterを所有している、Personは、EditIterLetterの可変ボローを転送EditIterは借りたとModeを作成しますLetterを送信します。 Iteratorの特性を削除してエラーメッセージに記載されているようにすると機能しますが、これはIterator特性を実装しません。

ロジックを保存してエラーを修正するにはどうすればよいですか?

答えて

1

あなたModeは、変更可能な参照のための必要性を持っているEditIterからmutを削除し、それが動作しますしないので:

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'は' Letter'を変更することができるはずです。 (例えば 'words')**' Mode' - 外部APIのコンポーネント。 'Letter'にはいくつかのパブリックメソッドがあります。 – nujemid

+0

@nujemidあなたに何を伝えるべきか分かりません。質問に記入した[MCVE](/ help/mcve)と説明文に基づいて、コードは私が行った変更でコンパイルして実行します。 – Shepmaster

+0

しかし、セットロジックが失われました。 – nujemid