Rust- 迭代器

2023-11-06

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 method called next() that returns Some(element) when there are more elements, and None when there are no more elements.

Here’s an example of basic usage of an iterator:

let v = vec![1, 2, 3];

let mut iter = v.iter();

assert_eq!(iter.next(), Some(&1));
assert_eq!(iter.next(), Some(&2));
assert_eq!(iter.next(), Some(&3));
assert_eq!(iter.next(), None);

In this example, v.iter() returns an iterator over &i32. The next method returns the next value wrapped in Some if there’s a value, or None if it’s gone through every item already.

Rust’s iterators are lazy, meaning they have no effect until you consume them. One common way to consume an iterator is to use a for loop, which is internally implemented using iterators:

let v = vec![1, 2, 3];

for i in v.iter() {
    println!("{}", i);
}

In addition to next, the Iterator trait defines a variety of useful methods (provided by the standard library), which can be used to do complex tasks. Here are a few examples:

  • map: Transforms the elements of an iterator.
  • filter: Filters elements based on a condition.
  • fold: Accumulates a value across an iterator.
  • collect: Consumes the iterator and returns a collection.
  • and many more…

Here’s an example using map and collect:

let v = vec![1, 2, 3];
let v_squared: Vec<_> = v.iter().map(|x| x * x).collect();

assert_eq!(v_squared, vec![1, 4, 9]);

In this case, map is used to square each element of the iterator, and collect is used to consume the iterator and produce a new Vec.

Note: iter() gives you an iterator over &T, and into_iter() gives you an iterator over T. There’s also iter_mut(), which gives you an iterator over &mut T, allowing you to modify the elements.

fn main() {
    let v = vec!["Rust", "Programming", "Language"];
    let mut it = v.iter();
    println!("{:?}", it.next());
    println!("{:?}", it.next());
    println!("{:?}", it.next());
    println!("{:?}", it.next());

    let iter = v.iter();
    for item in iter {
        println!("{}", item);
    }

    /*
        输出:
        Some("Rust")
        Some("Programming")
        Some("Language")
        None
        Rust
        Programming
        Language
    */

    /*
       iter() 返回一个只读可重入迭代器,迭代器元素的类型为 &T,
       into_iter() 返回一个只读不可重入迭代器,迭代器元素的类型为 T,
       iter_mut() 返回一个可修改重入迭代器,迭代器元素的类型为 &mut T
    */
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust- 迭代器 的相关文章

随机推荐

  • 02-C++多线程编程-创建子线程

    By kkmd66 理论学习 1 主线程是什么 什么时候开始 结束 2 子线程如何创建 生命周期是什么 3 thread类的基本使用方法 代码演示 1 线程ID区分不同的线程 2 join detach区别 include
  • 31岁零基础转行软件测试,现已成功入职月薪14K+

    二黑 华测在线上期学员 31岁 坐标上海 专科 石油与天然气地质勘探 学习3个月 从石油行业到IT行业 薪资 8K 14K 二黑同学通过三个月的学习 顺利入职成为一名软件测试工程师 成功从石油行业转行到IT行业 这篇文章分为三个部分 1 我
  • ubuntu latex 编译报错记录

    1 cls缺失 sudo apt get install texlive publishers 2 File algorithmic sty not found sudo apt install texlive science 这里推荐一个
  • 机器学习笔记(7)— 学习率、特征工程、多项式回归

    目录 判断梯度下降是否收敛 如何设置学习率 特征工程 多项式回归 判断梯度下降是否收敛 梯度下降的任务是找到能够使代价函数J最小的参数w和b 通常做法是绘制代价函数图 通过训练集计算出的 并且标出梯度下降每次迭代时J的值 此图中的横轴是梯度
  • 阅读Spring in action 实现书中实例时遇到的问题(三)之解决 JSR303校验获取ValidationMessage.properties错误信息文件的中文乱码问题

    使用 ValidationMessage properties配置错误信息 前端jsp页面回显错误提示信息时总是乱码 网上查了好久 最后还是下面的代码靠谱 在springmvc config xml中添加以下配置
  • 视图和内置函数的理解(很奈斯...)

    文章目录 一 视图介绍 二 视图作用 三 mysql内置函数 四 自主练习 五 mysql图形界面软件 六 数据备份 七 自主练习 一 视图介绍 视图 就是一张虚拟表 临时表 因为视图中表的结构和内容不是通过建表语句创建的 而是根据查询确定
  • es6-箭头函数

    代码
  • webpack 自动引入常用模块

    webpack 自动引入常用模块 描述 比如 lodash 这种库 要用时每个 js 文件都需要如下引入 import from lodash console log join 1 2 怎么才能不引入 lodash 也能直接 join 等方
  • OneDrive同步角标消失 - 解决方案

    问题 在电脑端使用OneDrive时 文件管理器OneDrive文件夹内的文件会在左下角显示同步状态 如下图 若没有显示同步角标 则此功能出现异常 下文介绍如何显示同步角标 值得一提的是 同步角标只起到显示作用 没有同步角标并不影响OneD
  • NCP1342芯片替代料PN8213 65W氮化镓充电器方案

    氮化镓快充已然成为了当下一个非常高频的词汇 在氮化镓快充市场迅速增长之际 65W这个功率段恰到好处的解决了大部分用户的使用痛点 从而率先成为了各大品牌的必争之地 ncp1342替代料PN8213氮化镓充电器主控芯片 适用于65w氮化镓充电器
  • 大数据课程K2——Spark的RDD弹性分布式数据集

    文章作者邮箱 yugongshiye sina cn 地址 广东惠州 本章节目的 了解Spark的RDD结构 掌握Spark的RDD操作方法 掌握Spark的RDD常用变换方法 常用执行方法 一 Spark最核心的数据结构 RDD弹性分布式
  • asp.net实现验证码程序

    1 可以实现验证码的自动更新 2 验证码html代码 li class mjiao2 span 验 证 码 span li
  • 出现Uncaught ReferenceError: $ is not defined错误

    今天在写ajax请求的时候 出现了Uncaught ReferenceError is not defined报错 未定义是为什么呢 后来才知道 原因一 你未引用jquery库jquery min js文件 或者说路径错误 原因二 忽略了H
  • 脚本语言与编译语言的区别

    文章目录 一 语法差异 二 执行方式差异 三 应用领域差异 四 总结 一 语法差异 脚本语言 脚本语言通常使用解释器逐行执行 不需要事先编译 它的语法相对简单 易于学习和使用 常见的脚本语言有Python JavaScript和Ruby等
  • 机器学习笔记(4)— 多特征变量

    1 多特征变量 本文主要介绍多特征变量的梯度下降法和特征缩放内容 2 多特征 多变量 多特征变量的目标函数为 假设x0 1 则目标函数为 把特征量x看作是一个向量 把特征量的参数也看做一个向量 所以目标函数可以表示为 多特征量的目标函数 又
  • linux 下 npm安装依赖报:stack Error: `gyp` failed with exit code: 1

    解决办法 切换到当前项目下即可 gt rm rf node gyp gt npm install g node gyp gt rm rf 项目 node modules 再次 npm install即可
  • Matlab学习入门篇(五)—— 数据可视化

    文章目录 一 离散数据图 1 1散点图 1 2 条形图 二 线图 2 1 二维线图 2 2 三维参数化曲线绘图函数 三 曲面 体积和多边形 数据可视化是指运用 计算机图形学和 图像处理技术 将数据转化为图形或图像并在屏幕上显示出来 以进行交
  • 合成数据加速高质量数据供给,AIGC的救星来了!

    毫无疑问 人工智能发展离不开海量数据 但真实世界的数据是有限的 且数据获取 数据标注等面临诸多难题 数据成为AI行业的 掣肘 如何打破 半个月来 数据要素频繁获得政策部门发声 中国证监会科技监管局局长姚前日前发文建议重点发展基于AIGC技术
  • MYSQL常见的4种数据类型

    转自 微点阅读 https www weidianyuedu com 一 数据类型是什么 数据类型是指列 存储过程参数 表达式和局部变量的数据特征 它决定了数据的存储格式 代表了不同的信息类型 有一些数据是要存储为数字的 数字当中有些是要存
  • 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 resp