2016-11-26 8 views
1

私はいくつかの内部データのイテレータを返す関数を含む特性を作成しようとしています。これは異なる構造体で実装できます。 Rustに関連する型の正しい型を推測させる方法はありますか?

std::iter::Map<std::slice::Iter<'_, u32>, [[email protected]:45:37: 45:43]> 

があります:私はそれがあることがわかり、エラーメッセージから(型の不一致を経て作成された) - しかし

trait WrapperTrait { 
    type WrapperIterator: Iterator<Item=u32>; 
    fn iter(&self) -> Self::WrapperIterator; 
} 
struct Wrapper { 
    data: Vec<u32> 
} 
impl WrapperTrait for Wrapper { 
    type WrapperIterator = ...; 
    fn iter(&self) -> Self::WrapperIterator { 
     return self.data.iter().map(|&x| x); 
    } 
} 

WrapperIterator用タイプはかなり複雑で次のように最小限の例です。 RustにWrapperIteratorの正しいタイプを推測させる方法?

+0

イディオムラストは、関数本体が 'self.data.iter()。map(|&x | x)'であることになります。 – Shepmaster

答えて

1

ルッシュにWrapperIteratorの正しいタイプを導き出させる方法はありますか?

いいえ実際、これはRustとはまったく反対です。関数の引数と戻り値の型に注釈を付けると、コンパイラはの内部にの型を推論することができます。

メソッドの本体から最上位の型を推測すると、その原因となった場所から遠く離れたひどいエラーメッセージが表示されます。ハスケルはこれを難しい方法で学び、すべてのトップレベル関数に明示的な型シグネチャがあることを主張しています。錆は決してその道を踏み外さないことを選んだ。 this answerも参照してください。それは生涯について語っていますが、同じポイントの多くが保持されます。

あなたunasked質問(どのように私はこのイテレータを返すん)すでに多くの重複があります。

はまだ別のものを求めてないいただき、ありがとうございます正確な重複

関連する問題