2017-10-24 10 views
4

私は、特性を実装する構造体のための一種のデフォルトイテレータを実装しようとしています。私の形質はDataRowを呼ばれ、テーブルのセルの行を表し、次のようになります。Rustで形質のイテレータを実装する

pub trait DataRow<'a> { 
    // Gets a cell by index 
    fn getCell(&self, i: usize) -> &DataCell<'a>; 

    // Gets the number of cells in the row 
    fn getNumCells(&self) -> usize; 
} 

私が提供するデフォルトのイテレータが行を反復処理すると、セル参照を返すために、これらの2つのメソッドを使用する必要があります。 Javaでは、Iterableを実装する抽象クラスのDataRowに沸き起こるでしょう。

impl<'a, T> IntoIterator for &'a T 
where 
    T: DataRow<'a> 
{ 
    type Item = &'a DataCell<'a>; 
    type IntoIter = DataRowIterator<'a, T>; 
    fn into_iter(self) -> DataRowIterator<'a, T> { 
     return DataRowIterator::new(self); 
    } 
} 

をしかし、誰もがのDataRow形質の独自の実装のために独自のイテレータを実装できるので、これは動作しません:錆で、私はIntoIteratorで最初に試してみました。自己のサイズはコンパイル時に知られていないので、

fn iter(&self) -> DataRowIterator<'a, Self> { 
    return DataRowIterator::new(self); 
} 

これは、しかし、いずれかの動作しません:

私の2回目の試行は、イテレータを作成し、それを返し形質にiter方法を追加しました時間。 DataRowには任意の数のセルを含めることができるので、それを回避するにはSizedとマークすることもできません。発生したエラーのノートを含む私のデモコードはここに提供されています:

https://play.rust-lang.org/?gist=dc128a133ffb5d7471d47d130520936d&version=stable

どのように誰かがカスタム形質について、このような「デフォルトのイテレータ」を実装でしょうか?

答えて

2

特性オブジェクトの参照にはIntoIteratorを実装できます。

impl<'a> IntoIterator for &'a DataRow<'a> { 
    type Item = &'a DataCell<'a>; 
    type IntoIter = DataRowIterator<'a>; 
    fn into_iter(self) -> DataRowIterator<'a> { 
     return DataRowIterator::new(self); 
    } 
} 

DataRowIterator代わり&Tの形質・オブジェクト参照&DataRowを保持しDataRow形質のための利用可能な方法を使用するように変更されなければなりません。

+0

これはうまくいきました、ありがとうございます!あなたが気にしていない場合、迅速なフォローアップの質問: コード内でコメントアウトされているループでは、 'ref cell in(&rowとして&DataRow)'を書く必要があります。このキャストの周りに道がありますか? – AlexanderF

+1

「誰もが独自のDataRow特性を実装するために独自のイテレータを実装できる」と言っているので、ある種のキャストが必要です。ヘルパー関数 'fn def_iter (p:&T) - >&DataRow {p}'を作成すると、コードは 'for cell in def_iter(&row)'になります。ところで、あなたは 'ref'を必要としません、セルはすでに参照です。 – red75prime

+0

それは理にかなっています。ありがとうございました! – AlexanderF

関連する問題