Rust 迭代器

这篇具有很好参考价值的文章主要介绍了Rust 迭代器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Rust 第21节 迭代器

迭代器模式:对一系列项执行某些任务
迭代器负责:
遍历每个项
确定序列(遍历)何时完成

Rust中的迭代器
如果只声明了迭代器而没有调用迭代器的方法,迭代器是没有工作的,没有效果的

迭代器的使用

    let v1 = vec![1,2,3];
    let v1_i = v1.iter();

    for value in v1_i {
        println!("{}",value);
    }

Iterator trait

所有迭代器都实现了Iterator Trait
Iterator Trait 仅要求实现一个方法:next
next:
    每次返回迭代器中的一项
    返回结果包裹在Some中
    结束是返回None
也可以手动调用迭代器的next方法
    let v1 = vec![1,2,3];
    let mut v1_i = v1.iter();
    if let Some(x) = v1_i.next() { //next 会改变迭代器的数据,干掉迭代器中的数据
        println!("x1 = {}",x);
    }

几个迭代器方法

iter方法:在不可变引用上创建迭代器
into_iter方法:创建的迭代器会获得所有权
iter_mut 方法: 创建可变引用迭代器

sum()方法

调用next的方法叫做消耗型适配器
因为调用他们会把迭代器消耗尽
例如sum() 求和

    let v1 = vec![1,2,3];
    let  v1_i = v1.iter();
    let sum : i32 = v1_i.sum();//要指定返回的类型
    println!("sum = {}",sum);

map()

Iterator trait 上的另外一些方法叫做 “迭代适配器”
把迭代器转换为不同种类的迭代器

map():
接收一个闭包,闭包作用于每一个元素
产生一个新的迭代器

相当于迭代器的所有的数据都作为参数调用该闭包,然后将闭包的结果作为一个新的迭代器

    let v1 = vec![1,2,3];
    let  v1_i = v1.iter();
    let y = |x| {
        x + 1
    };

    let y_i = v1_i.map(y);

    for value in y_i {
        println!("{}",value);
    }

collect() 方法

collect():
消耗型适配器,将结果收集到一个集合类型中;(将一个迭代器再变为集合)
集合的类型要手动声明

    let v1 = vec![1,2,3];
    let  v1_i = v1.iter();
    let y = |x| {
        x + 1
    };

    let y_i = v1_i.map(y);
    let z : Vec<_> = y_i.collect(); //这里_表示Vec中的类型由编译器自己确认

    println!("{:?}",z);

filter() 方法

filter 方法
接收一个闭包
这个闭包在遍历迭代器的每个元素时,返回BOOL类型;闭包的参数就是迭代器的数据
如果闭包返回True,当前元素将会包含在filter产生的迭代器中
如果闭包返回false,当前元素将不会包含在filter产生的迭代器中
简单来说就是过滤需要的元素

struct Data{
    name : String,
    money : u32,
}

fn filter_data(buff : Vec<Data>,money : u32) -> Vec<Data>{
    buff.into_iter().filter(|x|{
        x.money == money
    }).collect()  //过滤每个元素,并将结果组合成集合
}

... main.......
    let buff = vec![
        Data {
            name : "红烧肉".to_string(),
            money : 12,
        },
        Data {
            name : "糖醋里脊".to_string(),
            money : 15,
        },
        Data {
            name : "红烧排骨".to_string(),
            money : 15,
        },
    ];
    let v = filter_data(buff, 15);

    for data in v.iter() {
        println!("{}:{}",data.name,data.money);
    }
...........

使用Iterator trait 来创建自定义迭代器

只需要实现next 方法文章来源地址https://www.toymoban.com/news/detail-784438.html

//声明结构体
struct Count {
    count : u32,
}
//声明创建方法
impl Count {

    fn new(count : u32) -> Count {
    
        Count {
            count
        }
        
    }
    
}

//关联 Iterator trait
impl Iterator for Count {
    type Item = u32; //告诉成员类型
    fn next(&mut self) -> Option<Self::Item> {
        if self.count != 0 {   
            self.count -= 1;
            Some(self.count)
        } else {
            None
        }
    }
}


.....main....
    let mut v = Count::new(15);

    if let Some(x) = v.next() {
        println!("{}",x);
    }

    let x = v.into_iter();

    for v2 in x {
        println!("{}",v2)
    }
.................................

到了这里,关于Rust 迭代器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rust- 迭代器

    In Rust, an iterator is a pattern that allows you to perform some task on a sequence of items in turn. An iterator is responsible for the logic of iterating over each item and determining when the sequence has finished. In Rust, iterators are created by methods called iter() and into_iter() on collections like Vec , HashMap , etc. Rust’s iterators have a m

    2024年02月14日
    浏览(20)
  • rust学习-迭代器

    迭代器的实现方式提供了对多种不同的序列使用相同逻辑的灵活性 没有迭代器时只能用索引,迭代器处理了所有这些逻辑,减少了重复代码,消除了潜在的混乱 迭代器都实现了一个叫做 Iterator 的定义于标准库的 trait 使用iter执行一个个的遍历 iter:生成一个不可变引用的迭代

    2024年02月16日
    浏览(22)
  • rust 自动化测试、迭代器与闭包、智能指针、无畏并发

    编写测试可以让我们的代码在后续迭代过程中不出现功能性缺陷问题;理解迭代器、闭包的函数式编程特性; BoxT 智能指针在堆上存储数据, RcT 智能指针开启多所有权模式等;理解并发,如何安全的使用线程,共享数据。 编写测试以方便我们在后续的迭代过程中,不会改坏

    2024年02月16日
    浏览(33)
  • 【跟小嘉学 Rust 编程】十三、函数式语言特性:迭代器和闭包

    【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学 Rust 编程】六、枚举

    2024年02月11日
    浏览(43)
  • Rust编程语言入门之函数式语言特性:-迭代器和闭包

    闭包(closures) 迭代器(iterators) 优化改善 12 章的实例项目 讨论闭包和迭代器的运行时性能 闭包:可以捕获其所在环境的匿名函数。 闭包: 是匿名函数 保存为变量、作为参数 可在一个地方创建闭包,然后在另一个上下文中调用闭包来完成运算 可从其定义的作用域捕获值

    2023年04月08日
    浏览(33)
  • Rust中的迭代器的使用:map转换、filter过滤、fold聚合、chain链接

    Rust中的迭代器是一种强大的工具,它提供了一种灵活、通用的方法来遍历序列。迭代器是实现了Iterator trait的类型,并需要至少实现一个next函数,用于让迭代器指向下一个迭代对象,并返回一个Option用于指示对象是否存在。 迭代器相比于for循环有一些优势。首先,迭代器提

    2023年04月12日
    浏览(31)
  • Rust常用加密算法

    哈希运算(以Sha256为例) main.rs : Cargo.toml : 输出为: 6d65924d8e0580b9ac04d13da91c74c3ae28b08b4be4634ae06e647f42a88913 可以在线比对验证一下 验证数据完整性(使用HMAC) MAC(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥。

    2024年02月11日
    浏览(22)
  • 算法leetcode|66. 加一(rust重拳出击)

    给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储 单个 数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 1 = digits.length = 100 0 = digits[i] = 9 面对这道算法题目,二当家的再次陷入了

    2024年02月14日
    浏览(29)
  • 算法leetcode|79. 单词搜索(rust重拳出击)

    给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

    2024年02月09日
    浏览(46)
  • 算法leetcode|55. 跳跃游戏(rust重拳出击)

    给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 1 = nums.length = 3 * 10 4 0 = nums[i] = 10 5 面对这道算法题目,二当家的再次陷入了沉思。 可能想到要暴力尝试或者是双循环

    2024年02月08日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包