私は、特性を実装する構造体のための一種のデフォルトイテレータを実装しようとしています。私の形質は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
どのように誰かがカスタム形質について、このような「デフォルトのイテレータ」を実装でしょうか?
これはうまくいきました、ありがとうございます!あなたが気にしていない場合、迅速なフォローアップの質問: コード内でコメントアウトされているループでは、 'ref cell in(&rowとして&DataRow)'を書く必要があります。このキャストの周りに道がありますか? – AlexanderF
「誰もが独自のDataRow特性を実装するために独自のイテレータを実装できる」と言っているので、ある種のキャストが必要です。ヘルパー関数 'fn def_iter(p:&T) - >&DataRow {p}'を作成すると、コードは 'for cell in def_iter(&row)'になります。ところで、あなたは 'ref'を必要としません、セルはすでに参照です。 –
red75prime
それは理にかなっています。ありがとうございました! – AlexanderF