如何为特征实现“默认迭代器”?

Ale*_*erF 5 iterator rust

我正在尝试为实现特征的结构实现默认的迭代器。我的特征称为DataRow,代表一行表格单元格,看起来像这样:

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;
}
Run Code Online (Sandbox Code Playgroud)

我要提供的默认迭代器应使用这两种方法来迭代行并返回单元格引用。在Java中,这可以归结为一个DataRow实现的抽象类Iterable。在Rust中,我首先尝试使用IntoIterator

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是行不通的,因为任何人都可以为自己的DataRow特征实现实现自己的迭代器。

我的第二次尝试是向itertrait 添加一个方法,该方法创建迭代器并返回它:

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

这也不起作用,因为Self在编译时不知道的大小。由于DataRow可以包含任意数量的单元格,因此我也无法将其标记为Sized可以解决该问题。

我的演示代码包括有关发生的错误的注释

有人将如何为自定义特征实现这种“默认迭代器”?

red*_*ime 4

您可以实现IntoIterator特征对象引用。

impl<'a> IntoIterator for &'a DataRow<'a> {
    type Item = &'a DataCell<'a>;
    type IntoIter = DataRowIterator<'a>;

    fn into_iter(self) -> DataRowIterator<'a> {
        DataRowIterator::new(self)
    }
}
Run Code Online (Sandbox Code Playgroud)

DataRowIterator应该修改以保留特征对象引用,&DataRow而不是&T使用特征可用的方法DataRow