首页 > 其他分享 >0025-Rust-自实现迭代器

0025-Rust-自实现迭代器

时间:2022-08-29 17:55:16浏览次数:76  
标签:迭代 0025 value next let iter usize Rust

环境

  • Time 2022-05-21
  • Rust 1.61.0

前言

说明

参考:https://doc.rust-lang.org/std/iter/trait.IntoIterator.html

目标

前一节自定义了一个类型来实现迭代器,并且自定义了一个方法来转化成迭代器。标准库中提供了一个转化成迭代器 trait

自定义类型

struct MyData {
    value1: usize,
    value2: usize,
    value3: usize,
    value4: usize,
}

Default

impl Default for MyData {
    fn default() -> Self {
        Self {
            value1: 88,
            value2: 44,
            value3: 66,
            value4: 22,
        }
    }
}

实现迭代器

#[derive(Debug)]
struct MyIterator(Vec<usize>);

impl Iterator for MyIterator {
    type Item = usize;

    fn next(&mut self) -> Option<Self::Item> {
        self.0.pop()
    }
}

生成迭代器

impl IntoIterator for MyData {
    type Item = usize;
    type IntoIter = MyIterator;

    fn into_iter(self) -> Self::IntoIter {
        let vec = vec![self.value4, self.value3, self.value2, self.value1];
        MyIterator(vec)
    }
}

使用迭代器

fn main() {
    let mut iter = MyData::default().into_iter();
    while let Some(value) = iter.next() {
        println!("value: {value:?}")
    }
    println!("{iter:?}")
}

for 语法糖

因为实现了 IntoIterator trait 的可以直接使用 for 遍历,所以可以简写。

fn main() {
    for value in MyData::default() {
        println!("value: {value:?}")
    }
}

for 去糖后

fn main() {
    let result = match IntoIterator::into_iter(MyData::default()) {
        mut iter => loop {
            let next;
            match iter.next() {
                Some(val) => next = val,
                None => break,
            };
            let x = next;
            let () = {
                println!("value: {}", x);
            };
        },
    };
    result
}

总结

实现了 IntoIterator trait,并且使用了 for 语法糖。

附录

标签:迭代,0025,value,next,let,iter,usize,Rust
From: https://www.cnblogs.com/jiangbo4444/p/16636795.html

相关文章

  • 0023-Rust-自实现迭代器
    环境Time2022-05-19Rust1.60.0前言说明参考:https://doc.rust-lang.org/std/iter/index.html目标针对自定义类型,实现一个迭代器。自定义类型#[derive(Default,......
  • 我在 Rust 中的第一个真实代码
    我在Rust中的第一个真实代码每种语言都始于游乐场。你可以在那里做一些令人惊奇的事情,但它们就像邻近的儿童沙饼一样令人惊奇。一旦你从操场进入“做一些真正的事情”,......
  • Rust学习笔记-初识
    很早以前,看到马斯克说:“我是Rust的粉丝,但是为了性能会选择C。”之后就对Rust产生了一些兴趣,不过由于时间关系没有及时深入了解。最近,又看到Meta选定四种编程语言作为首选......
  • es6——iterator迭代器
    iterator的说明1es6创建了一种新的迭代器2forof可以遍历使用迭代器3ArrayArgumentsSetMapStringTypeArrayNodeList都支持4iterator是对象的一个symbol类......
  • Python基础——迭代器 生成器
    迭代器iterator迭代简单理解就是重复,但是每次重复产生的结果还要作为下次重复的初始值。可迭代对象:含有——iter——方法的对象。可以用for...in..遍历的都是可迭代对......
  • 正确的策略迭代流程是什么?
    当前已经有了一版线上用户正在使用的方案,然后算法对某些策略做了模型迭代或者规则优化(反映在cxr或者更好的用户体验)产生了一版新的方案,新方案的上线流程是怎样的?方式一:新......
  • Rust-语句和表达式
    语句和表达式Rust的函数体是由一系列语句组成,最后由一个表达式来返回值,例如:fnadd_with_extra(x:i32,y:i32)->i32{letx=x+1;//语句lety=y+......
  • 关于 map 的迭代器
     今天遇到一个问题CountCompileResult(constLIST_MAP&rfLmCompileWafers){    for(autoitr=rfLmCompileWafers.begin();itr!=rfLmCompileWafers.e......
  • 技术分享| anyRTC 8月更新迭代
    anyRTC8月更新迭代,新增视频水印功能,有效保护企业版权;此外还添加了抓拍图片功能;同时对音视频模块,实时消息模块等多项功能进行了优化改进。SDK新增1、新增视频水印功能为......
  • STL——反向迭代器
    正向迭代器:map<int, int>::iterator mit;反向迭代器:map<int, int>::reverse_iterator rit;     两者相差一个元素,从一个反向迭代器获得对应的正向迭代器需......