rust 自定义结构上的迭代器实现-问题

jgzswidk  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(153)

我试图打印出一些基本数据的编码十六进制字符串,我插入作为如何序列化/反序列化数据的一课。然而,要做到这一点,我必须实现一个迭代器的结构,有一个单一的元素类型Vec。我得到了下面的错误,不明白为什么,我意识到我的代码是不完整的next()实现。我是相当新的迭代器,任何帮助将不胜感激。
错误:
第一个

lp0sw83n

lp0sw83n1#

你的问题有点模糊,但让我们试着看看我们能做些什么:

正在迭代内部字段

如果要逐字节处理数据,可以迭代数据本身:

for hex in my_data.data { ... }

迭代但不公开内部字段

您也可以返回data上的迭代器,而不向代码的其余部分公开该字段:

impl MyData {
  fn iter_data(&self) -> impl Iterator<Item = &MyHex> {
    self.data.iter()
  }
}

...
for hex in my_data.iter_data() { ... }

实现IntoIterator
如果你想让MyData作为迭代器工作,你可以为它实现IntoIterator特征:

impl<'a> IntoIterator for &'a MyData {
    type Item = &'a MyHex;
    type IntoIter = std::slice::Iter<'a, MyHex>;

    fn into_iter(self) -> Self::IntoIter {
        self.data.iter()
    }
}

...

for v in &my_data {
    println!("{:?}", v);
}

Playground
MyData实现Iterator
要实现Iterator,需要提供next方法,每次调用该方法都会返回迭代器中的下一项,只要还有剩余项。为此,需要在MyData中添加一个字段,用于跟踪返回的最后一项,并在每次调用next()时递增该指针。
但是从你的代码中我猜这并不是你真正想要的东西。宁愿选择前面的一个选项。

相关问题