Rust编程-函数式编程

函数式编程:

函数式风格编程通常包括将函数当作参数、将函数作为其他函数的返回值或将函数赋给变量以备之后执行等。

闭包:

一个类似函数,并且可以存储在变量中的结构。闭包拥有很好的运行性能。

闭包可以存入变量或作为参数传递给其他函数的匿名函数。

闭包可以从定义它的作用域中获取值。

迭代器:

处理一系列元素的方法。

闭包:

闭包不要求明确标注参数和返回值的类型,因为闭包永远不会作为公共接口对外暴露。因此编译器能够推导出参数和返回值的类型。但是,一旦编译器推导类型确定了,那么就只能传入该类型的参数。

结构体、枚举或函数参数中使用闭包:

闭包在结构体中必须指明类型,因为结构体中各个字段的类型在定义时就必须确定。每一个闭包实例都有它自己的匿名类型。两个闭包拥有完全相同的签名,它们的类型也被认为是不一样的。

所有的闭包都至少实现了标准库中提供的Fn、 FnMut及FnOnce中的一个trait。

Fn Trait:

Fn的trait约束中添加代表了闭包参数和闭包返回值的类型。

rust 复制代码
struct Cacher<T>
  where T:Fn(u32)->u32
{
    calculation:T,
    value:Option<u32>
}

泛型T的类型约束是Fn Trait。

闭包捕获上下文环境

闭包可以捕获自己所在的环境并访问自己被定义时的作用域中的变量。

闭包从上下文环境中获取变量有三种方式:获取所有权、可变借用及不可变借用,三种方式分别被封装在三种不同的Trait中:

**FnOnce:**闭包必须在定义时取得这些变量的所有权并将它们移动至闭包中。可以通过在参数列标签添加move,

**FnMut:**可以从环境中可变地借用值并对它们进行修改

**Fn:**可以从环境中不可变地借用值。

rust 复制代码
    let equal_to_x = move |z| z == x;

迭代器:

迭代器模式允许你依次为序列中的每一个元素执行某些任务

创建一个迭代器:

在Rust中,迭代器是惰性的(layzy)。这也就意味着创建迭代器后,除非你主动调用方法来消耗并使用迭代器,否则它们不会产生任何的实际效果。

terator trait:迭代器trait

rust 复制代码
pub trait Iterator{
    type Item; // 定义关联类型
    fn next(&mut self) -> Option<Self::Item>; // Self::Item
}
rust 复制代码
let v1 = vec![1,2,3];
let  mut v1_iter = v1.iter();
assert_eq!(v1_iter.next(),Some(&1)); // 这里所&1,表示所对值1的引用

iter: 生成的是一个不可变引用的迭代器

**into_iter:**生成一个获取所有权,并返回元素本身的迭代器

**iter_mut:**返回一个可变引用的迭代器,允许你遍历集合并可能修改其中的元素。

消耗迭代器的方法:

**next方法:**调用next的方法也被称为消耗适配器 (consuming adaptor)

**sum()方法:**获取迭代器的所有权并反复调用next来遍历元素,进而导致迭代器被消耗

rust 复制代码
let v1 = vec![1, 2, 3];
let v1_iter = v1.iter();
let total: i32 = v1_iter.sum();
assert_eq!(total, 6);
println!("{:?}",v1_iter); // 报错,所有权已经被sum函数占有使用

生成其他迭代器的方法:

map:

rust 复制代码
let v1: Vec<i32> = vec![1, 2, 3];
let iter_v1:Vec<i32> = v1.iter().map(|x| x + 1).collect();
assert_eq!(iter_v1,vec![2,3,4]);

调用map方法创建新迭代器,接着再调用collect方法将其消耗掉并得到一个动态数组

filter:

rust 复制代码
fn shoes_in_my_size(shoes: Vec<Shoe>, shoe_size: u32) -> Vec<Shoe> {
        shoes.into_iter()
        .filter(|s| s.size == shoe_size)
        .collect()
    }
相关推荐
梁正雄几秒前
1、python基础语法
开发语言·python
爷_17 分钟前
Golang: sqlc 和 goose 最佳实践
后端·go·全栈
强化学习与机器人控制仿真24 分钟前
RSL-RL:开源人形机器人强化学习控制研究库
开发语言·人工智能·stm32·神经网络·机器人·强化学习·模仿学习
百***480731 分钟前
【Golang】slice切片
开发语言·算法·golang
q***925138 分钟前
Windows上安装Go并配置环境变量(图文步骤)
开发语言·windows·golang
2***65631 小时前
数据库操作与数据管理——Rust 与 SQLite 的集成
数据库·rust·sqlite
仟濹1 小时前
【Java 基础】面向对象 - 继承
java·开发语言
万少1 小时前
我是如何使用 Trae IDE 完成《流碧卡片》项目的完整记录
前端·后端·ai编程
ituff1 小时前
微软认证考试又免费了
后端·python·flask
郝学胜-神的一滴1 小时前
Linux命名管道:创建与原理详解
linux·运维·服务器·开发语言·c++·程序人生·个人开发