gpt4 book ai didi

iterator - 如何为特征实现 "default iterator"?

转载 作者:行者123 更新时间:2023-11-29 07:51:07 33 4
gpt4 key购买 nike

我正在尝试为实现特征的结构实现默认迭代器。我的特征称为 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;
}

我想提供的默认迭代器应该使用这两种方法来迭代行并返回单元格引用。在 Java 中,这将归结为实现 Iterable 的抽象类 DataRow。在 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);
}
}

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

我的第二个尝试是将 iter 方法添加到创建迭代器并返回它的特征:

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

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

My demo code including notes on the occurring errors

如何为自定义特征实现这样的“默认迭代器”?

最佳答案

您可以为特征对象引用实现 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)
}
}

DataRowIterator 应修改为保留特征对象引用 &DataRow 而不是 &T 并使用可用于 DataRow 特质。

关于iterator - 如何为特征实现 "default iterator"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46907960/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com