首页 > 其他分享 >无涯教程-Rust - 迭代&闭包

无涯教程-Rust - 迭代&闭包

时间:2024-01-25 20:32:21浏览次数:27  
标签:闭包 函数 迭代 无涯 iter let println Rust

在本章中,我们将学习RUST中的迭代器和闭包如何工作。

Iterator 迭代器

迭代器有助于迭代值的集合,例如数组,向量,Map映射等,迭代器实现Rust标准库中定义的Iterator trait,iter()方法返回集合的迭代器对象,迭代器对象中的值称为元素,迭代器的next()方法可用于遍历元素,当到达集合末尾时,next()方法将返回值None。

以下示例使用迭代器从数组读取值。

fn main() {
   //声明一个数组
   let a=[10,20,30];

   let mut iter=a.iter(); 
   //获取数组的迭代器对象
   println!("{:?}",iter);

   //从迭代器对象中获取单个值
   println!("{:?}",iter.next());
   println!("{:?}",iter.next());
   println!("{:?}",iter.next());
   println!("{:?}",iter.next());
}
Iter([10, 20, 30])
Some(10)
Some(20)
Some(30)
None

如果类似array或Vector的集合实现Iterator trait,则可以使用for ... in语法遍历它,如下所示-

fn main() {
   let a=[10,20,30];
   let iter=a.iter();
   for data in iter{
      print!("{}\t",data);
   }
}
10 20 30

以下3种方法从集合中返回迭代器对象 ,其中T表示集合中的元素。

Sr.No Methods & 描述
1

iter()

给出&T的迭代器(对T的引用)

2

into_iter()

给出T上的迭代器

3

iter_mut()

给出&mut T的迭代器

iter()  函数

iter()函数返回对集合中每个元素的引用,使集合保持不变,并在循环后可以重用。

fn main() {
   let names=vec!["Kannan", "Learnfk", "Kiran"];
   for name in names.iter() {
      match name {
         &"Learnfk" => println!("There is a rustacean among us!"),
         _ => println!("Hello {}", name),
      }
   }
   println!("{:?}",names); 
   //迭代后重用集合
}
Hello Kannan
There is a rustacean among us!
Hello Kiran
["Kannan", "Learnfk", "Kiran"]

into_iter()  函数

此函数将集合中的值移动到一个iter对象中,即该集合已被使用,并且不再可重用。

fn main(){
   let names=vec!["Kannan", "Learnfk", "Kiran"];
   for name in names.into_iter() {
      match name {
         "Learnfk" => println!("There is a rustacean among us!"),
         _ => println!("Hello {}", name),
      }
   }
   //迭代后无法重用集合
   //println!("{:?}",names); 
   //错误:所有权转移后无法访问
}
Hello Kannan
There is a rustacean among us!
Hello Kiran

for和iter_mut()  函数

此函数类似于 iter()函数,但是,此函数可以修改集合中的元素。

fn main() {
   let mut names=vec!["Kannan", "Learnfk", "Kiran"];
   for name in names.iter_mut() {
      match name {
         &mut "Learnfk" => println!("There is a rustacean among us!"),
         _ => println!("Hello {}", name),
      }
   }
   println!("{:?}",names);
   ////迭代后重用集合
}
Hello Kannan
There is a rustacean among us!
Hello Kiran
["Kannan", "Learnfk", "Kiran"]

Closure 闭包

闭包是指另一个函数中的一个函数,这些是匿名函数–没有名称的函数,闭包可用于将函数分配给变量,这允许程序将函数作为参数传递给其他函数,闭包也称为内联函数,内联函数可以访问外部函数中的变量。

定义闭包

闭包定义可以可选地具有参数,参数包含在两个垂直条中。

let closure_function=|parameter| {
   //logic
}

调用Closure的语法实现Fn特性。因此,可以使用()语法来调用它。

closure_function(parameter);    //调用

闭包示例1

以下示例在函数 main()中定义了闭包 is_even ,如果数字为偶数,则闭包返回true,如果数字为奇数,则闭包返回false。

fn main(){
   let is_even=|x| {
      x%2==0
   };
   let no=13;
   println!("{} is even ? {}",no,is_even(no));
}
13 is even ? false

闭包示例2

fn main(){
   let val=10; 
   //在外面声明
   let closure2=|x| {
      x + val //访问外部 fn 变量的内部函数
   };
   println!("{}",closure2(2));
}

main()函数声明一个变量 val 和一个闭包,闭包访问在外部函数 main()中声明的变量。

12

参考链接

https://www.learnfk.com/rust/rust-iterator-and-closure.html

标签:闭包,函数,迭代,无涯,iter,let,println,Rust
From: https://blog.51cto.com/u_14033984/9419003

相关文章

  • 无涯教程-Rust - 文件输入&输出
    除了对控制台进行读写之外,Rust还允许对文件进行读写,File结构代表一个文件,它允许程序对文件执行读写操作,File结构中的所有方法均返回io::Result枚举的变体。写入文件以下程序创建文件"data.txt",create()方法用于创建文件,如果文件创建成功,该方法将返回文件句柄,最后一行write_a......
  • 无涯教程-Rust - 输入&输出
    本章讨论如何接受来自标准输入Input的值以及如何将值显示到标准输出Output,在本章中,我们还将讨论传递命令行参数。读和写Rust的input和output标准库函数围绕两个特征进行组织-Read读Write写Sr.NoTrait&描述Example1Read- 实现Read的类型具有面向字节输入的方法。S......
  • 25从零开始用Rust编写nginx,序列化之serde是如何工作的
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/tickbh/wmproxy序......
  • 无涯教程-Rust - 错误处理
    在Rust中,错误可以分为两大类,如下表所示。Name&描述UsageRecoverable可恢复的错误ResultenumUnRecoverable无法恢复的错误panicmacro与其他编程语言不同,Rust没有Exception异常,它返回可恢复错误的枚举Result<T,E>,如果程序遇到不可恢复的错误,则调用panic宏。Panic......
  • Rust 一个 I/O 项目:构建一个命令行程序
    本篇在原文基础上有删减和添加,增加了一些细节内容,原文请参考一个I/O项目:构建一个命令行程序。目录接受命令行参数读取参数值将参数值保存进变量读取文件重构改进模块性和错误处理二进制项目的关注分离提取参数解析器组合配置值使用clone的权衡取舍创建一个Config的构造函数......
  • rust使用lazy_static对全局变量多线程并发读写示例
    首先需要在项目依赖Cargo.toml添加lazy_static依赖项[dependencies]lazy_static="1.4.0"示例代码如下:uselazy_static::lazy_static;usestd::sync::{RwLock,RwLockReadGuard,RwLockWriteGuard};usestd::thread;#[derive(Debug)]structSharedData{data:Vec<......
  • 无涯教程-Rust - 元组(Tuple)
    元组是复合数据类型,标量类型只能存储一种类型的数据,如一个i32变量只能存储一个整数值。在复合类型中,我们可以存储多个值,并且可以是不同类型。元组的长度是固定的,一旦声明,它们就无法增长或缩小,元组索引从0开始。Tuple-语法//语法1lettuple_name:(data_type1,data_type2,d......
  • 无涯教程-Rust - 变量声明
    变量是程序可以操纵的命名存储,Rust中的变量与特定的数据类型相关联。数据类型决定变量的内存大小,可以存储在该内存中的值的范围以及可以对该变量执行的一组操作。命名规则在本节中,我们将学习命名变量的不同规则。变量的名称可以由字母,数字和下划线字符组成。必须以字母或下划......
  • 无涯教程-Rust - 数据类型
    Rust是一种静态类型的语言,Rust中的每个值都需要指定某种数据类型,编译器也可以根据分配给它的值自动推断变量的数据类型。声明变量使用let关键字声明一个变量。fnmain(){letcompany_string="LearnFk";//字符串类型letrating_float=4.5;//浮......
  • 无涯教程-Rust - 环境设置
    通过rustup(一种用于管理Rust版本和相关工具的基于控制台的工具),可以轻松安装Rust。在Windows上安装让我们学习如何在Windows上安装RUST。必须强制使用C++工具安装VisualStudio2013或更高版本,才能在Windows上运行Rust程序,首先,从此处下载VisualStudioVS2013Express......