首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义结构问题的Iterator实现

自定义结构问题的Iterator实现
EN

Stack Overflow用户
提问于 2022-11-30 06:11:20
回答 1查看 33关注 0票数 -1

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

错误:

代码语言:javascript
复制
error[E0599]: no method named `iter_mut` found for struct `MyData` in the current scope
   --> src/main.rs:110:22
    |
21  | pub(crate) struct MyData {
    | ------------------------ method `iter_mut` not found for this struct
...
110 |     for v in my_data.iter_mut() {
    |  
代码语言:javascript
复制
#[derive(Serialize, Deserialize, Debug)]
#[serde(transparent)]
struct MyHex {
    #[serde(with = "hex::serde")]
    hex: Vec<u8>,
}

#[derive(Serialize, Deserialize, Debug)]
pub(crate) struct MyData {
    data: Vec<MyHex>,
}

impl Iterator for MyData {

    type Item = usize;

    fn next(&mut self) -> Option<Self::Item>;

}


fn main() -> Result<()> {

    let data = "
        { 
            \"data\": [\"bbac4013c1ca3482155b584d35dac185\",
                \"a08898e81f1ddb6612aa12641b856aa9\",
                \"bbac4013c1ca3482155b584d35dac185\"
            ]
        }";

    let my_data: MyData = serde_json::from_str(data)?;


    for v in my_data.iter_mut() {
        println!("{:?}", hex::encode(v));
    }


    return Ok(());
}
EN

回答 1

Stack Overflow用户

发布于 2022-11-30 08:42:34

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

迭代内场

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

代码语言:javascript
复制
for hex in my_data.data { ... }

迭代而不公开内部字段

您还可以通过data返回迭代器,而无需将字段公开给其余代码:

代码语言:javascript
复制
impl MyData {
  fn iter_data(&self) -> impl Iterator<Item = &MyHex> {
    self.data.iter()
  }
}

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

实现IntoIterator

如果希望MyData作为迭代器工作,可以为其实现IntoIterator特性:

代码语言:javascript
复制
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);
}

游乐场

IteratorMyData中的实现

要实现Iterator,您需要提供next方法,在每次调用时,该方法将返回迭代器中的下一个项,而此时仍有任何项。要做到这一点,您需要向MyData中添加一个字段,该字段跟踪返回的最后一个项,并在每次调用next()时增加该指针。

但是从你的代码来看,我想这不是你真正想要的东西。选择前面的选项之一。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74623532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档