【 Rust知识】闭包和迭代器

闭包

闭包:可以捕获其所在环境的匿名函数

  • 是匿名函数
  • 可以保存为变量,作为参数
  • 可以在一个地方创建闭包,然后再另一个上下文中调用闭包来完成运算
  • 可从其定义的作用域捕获值

闭包的定义格式

let var = |变量名:变量类型| -> 返回值类型{ 函数体; 返回值 }

  • 如果变量类型可以自动推断出,可以省略
  • 返回值类型没有或可以自动推断,可以省略
  • 函数体只有一行,括号可以省略

使用闭包捕获环境

闭包可以访问定义它的作用域内的变量,而普通函数则不能

rust 复制代码
fn main(){
 let x = 4;
 let equal_to_x = |z| z==x;
 let y =4
 assert!(equal_to_x(y));
}
  • 上面的代码可以看出,闭包可以直接访问x变量
  • 如果换成函数定义,就会报错,因为函数不能访问外部的变量
  • 但是这个操作会产生内存开销

闭包从所在环境捕获值的三种方式

与函数获得参数的三种方式一样:

  • 取得所有权:FnOnce
  • 可变借用:FnMut
  • 不可变借用:Fn 创建闭包时,通过闭包对环境值的使用,Rust推断出具体使用哪个Trait
  • 所有的闭包都实现了FnOnce
  • 没有移动捕获变量的实现了FnMut
  • 无需可变访问捕获变量的闭包实现了Fn 当指定Fn traitBound之一时,首先应该使用Fn,基于闭包体里的情况,rust会提示是否需要FnMut或FnOnce

迭代器

迭代器模式:对一系列项执行某些任务

  • 遍历每个项
  • 确定序列(遍历)何时完成 Rust的迭代器:
  • 懒惰的:除非调用消费迭代器的方法,否则迭代器本身没有任何效果

几个迭代方法

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

产生迭代器的方法

  • 可以通过链式调用使用多个迭代器适配器来执行复杂的操作,这种调用可读性较高 例如map:
  • 接收一个闭包,闭包作于每个元素,
  • collect方法:消耗性适配器,把结果收集到一个集合类型中
rust 复制代码
fn iteratior_sum(){
    let v1 = vec![1,2,3];
    let v2: Vec<i32> = v1.iter().map(|x|x+1).collect();
    println!("{:?}",v2);
}

一个迭代器对象经过过滤,返回结果还是迭代器:

rust 复制代码
fn shoes_in_my_size(shoes: Vec<shoe>, shoe_size: u32) -> Vec<shoe> {
    shoes.into_iter().filter(|s| s.size == shoe_size).collect()
}
相关推荐
初恋叫萱萱3 小时前
基于 Rust 与 DeepSeek V3.2 构建高性能插件化 LLM 应用框架深度解析
网络·人工智能·rust
码农葫芦侠4 小时前
Rust学习教程2:基本语法
开发语言·学习·rust
键盘鼓手苏苏5 小时前
Flutter for OpenHarmony 实战:Envied — 环境变量与私钥安全守护者
开发语言·安全·flutter·华为·rust·harmonyos
马克Markorg10 小时前
使用rust实现的高性能api测试工具
开发语言·测试工具·rust·postman
中国胖子风清扬10 小时前
GPUI 在 macOS 上编译问题排查指南
spring boot·后端·macos·小程序·rust·uni-app·web app
键盘鼓手苏苏11 小时前
Flutter for OpenHarmony:injector 轻量级依赖注入库(比 GetIt 更简单的选择) 深度解析与鸿蒙适配指南
css·网络·flutter·华为·rust·harmonyos
BigNiu1 天前
rust遮蔽(shadow)示例代码
rust
程序员的那些事_1 天前
微软用 Rust 开发了一个库操作系统 LiteBox
开发语言·后端·rust
键盘鼓手苏苏1 天前
Flutter for OpenHarmony:cider 自动化版本管理与变更日志生成器(发布流程标准化的瑞士军刀) 深度解析与鸿蒙适配指南
运维·开发语言·flutter·华为·rust·自动化·harmonyos
IT 行者1 天前
ZeroClaw:Rust 驱动的下一代 AI Agent 基础设施
开发语言·人工智能·rust