Rust 函数式编程的具体使用

 更新时间:2025年06月27日 10:11:32   作者:pumpkin84514  
本文主要介绍了Rust 函数式编程的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Rust 是一门多范式语言,既可以像 C++/Java 那样写“命令式代码”,也支持“函数式编程”。但很多刚入门的小伙伴可能会有这些疑问:

函数不就是函数吗?什么是纯函数?
什么又是副作用?函数式和我熟悉的 Java/C++ 有啥区别?
我该怎么开始写函数式风格的 Rust 代码?

别急,今天我们从零出发,把这些看起来很抽象的概念通通讲清楚

一、什么是函数式编程?一句话概括

函数式编程(Functional Programming)是:用纯粹、可组合的函数来表达程序逻辑,同时避免副作用。

看不懂?我们来一句一句拆开讲 👇

1. 什么是“纯粹的函数”(纯函数)?

很多人第一反应是:“函数不都是函数吗?为啥还要强调‘纯’?”

来,举个例子你就懂了:

举个例子

fn add(a: i32, b: i32) -> i32 {
    a + b
}

这个函数:

  • 输入什么,输出就是什么(比如 2 + 3 永远等于 5)
  • 不会打印东西、不写文件、不改全局变量

✅ 所以它是个“纯函数”。

再举一个反面例子

fn print_and_add(a: i32, b: i32) -> i32 {
    println!("正在加法运算!");
    a + b
}

这个函数除了计算结果,还打印了一句话,这叫做副作用

2. 什么是“副作用”?

副作用 = 函数除了返回结果,还影响了“外部世界”

行为是副作用吗?原因
改了一个全局变量✅ 是改变了外部状态
打印输出 println!✅ 是改变了控制台
写入文件✅ 是改变了磁盘状态
发 HTTP 请求✅ 是影响了外部网络
单纯返回值❌ 否没动外部任何东西

为什么函数式编程追求“无副作用”?

因为副作用:

  • 会让程序变得难以预测(打印/写文件在哪影响了谁?)
  • 不利于并发(多个线程操作全局变量可能会打架)
  • 不好测试(一个函数打印日志、改配置很难自动验证)

3. 什么是“组合性”?为啥函数式编程要“可组合”?

组合性 = 把小函数像积木一样拼起来,组成更大的逻辑

比如:

let data = vec![1, 2, 3, 4, 5];

let result: i32 = data
    .iter()              // 遍历
    .filter(|x| *x % 2 == 0) // 只保留偶数
    .map(|x| x * 2)      // 每个数翻倍
    .sum();              // 求和

println!("{}", result);  // 输出 12(2*2 + 4*2)

这段代码没有循环、没有中间变量,却能一步步地处理数据。
每个函数(如 filtermap)都很简单,但组合起来就完成了复杂的逻辑!

这种“拼积木”的能力,就是组合性

函数式编程的三大思想总结:

概念通俗解释关键目的
纯函数不依赖外部,不改外部,只靠输入决定输出稳定、可预测
无副作用不打印、不改文件、不改全局变量可测试、线程安全
可组合把小函数组合成大逻辑简洁、模块化

函数式 VS 命令式(C++/Java)

对比点命令式(C++/Java)函数式(Rust风格)
编程方式写“怎么做”写“要什么”
控制结构for、if、变量改来改去map/filter/链式处理
状态管理变量经常变化默认不可变
副作用难避免尽量消除
函数角色封装逻辑构建模块
可读性操作细节多更像自然语言表达

Rust 支持函数式编程的方式(显著特征表)

特征Rust 中的支持方式示例
✅ 纯函数所有普通函数默认都可以写成纯函数fn add(a, b) -> a + b
✅ 不可变性默认 let 是不可变的let x = 5;
✅ 闭包(匿名函数)使用 |x| x + 1 定义let f = |x| x + 1;
✅ 高阶函数函数可以作为参数传入map(|x| x * 2)
✅ 惰性计算Iterator 是惰性执行的.iter().map().filter()
✅ 函数组合使用链式调用.map().filter().sum()

🔍 解释闭包:闭包就是一个没有名字的“临时函数”,可以捕获外部变量,语法是 |参数| 表达式

如何从零开始上手 Rust 函数式编程?

很多人卡在一开始不知道怎么写函数式代码,我们一步步来:

第一步:掌握函数式写法格式

写法示例含义
匿名函数(闭包)使用 |x| x + 1 定义let f = |x| x + 1;
高阶函数map(|x| x * 2)传函数给函数
链式调用.filter().map()像流水线一样处理数据
collect 收集结果.collect::<Vec<_>>()把处理结果收集成 Vec

第二步:从 for 循环重构开始

传统写法:

let mut result = vec![];
for i in 1..=5 {
    if i % 2 == 0 {
        result.push(i * 2);
    }
}

函数式写法:

let result: Vec<_> = (1..=5)
    .filter(|x| x % 2 == 0)
    .map(|x| x * 2)
    .collect();

第三步:试着传函数给函数(高阶函数)

fn operate(x: i32, f: fn(i32) -> i32) -> i32 {
    f(x)
}

fn main() {
    let double = |x| x * 2;
    println!("{}", operate(3, double)); // 输出 6
}

总结:Rust 函数式编程,到底有什么价值?

优点对初学者的意义
✅ 代码更短更清晰不需要手动管理中间变量
✅ 更容易测试没副作用就是好测试
✅ 更少 bug不容易改错变量
✅ 更好并发支持不争抢变量,天然线程安全

后续你可以这样学习函数式思维:

  • 把所有 for 循环都试着用 .iter().map().filter() 改写
  • 学会闭包、理解闭包和变量捕获
  • 阅读标准库 Iterator Trait 的文档
  • 多写链式组合:map、filter、fold、collect
  • 理解 Option / Result 和函数式结合的优雅用法

到此这篇关于Rust 函数式编程的具体使用的文章就介绍到这了,更多相关Rust 函数式编程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • R语言ggplot2绘图安装与调试

    R语言ggplot2绘图安装与调试

    ggplot2是R语言中最常用的绘图包之一,它提供了一种基于图层的绘图语法,使得用户可以轻松地创建高质量的数据可视化图表。在使用ggplot2之前,需要先安装该包并进行调试。安装ggplot2可以通过CRAN或GitHub进行,调试则需要注意数据格式、语法错误等问题。
    2023-06-06
  • Rust的泛型、Traits与生命周期用法及说明

    Rust的泛型、Traits与生命周期用法及说明

    本文通过一个寻找列表中最大值的示例,展示了如何从重复代码中提取函数,再利用泛型实现代码复用,主要步骤包括:识别重复逻辑;抽象提取;泛型应用;进一步扩展,通过不断抽象和泛化,我们不仅能减少代码重复,还能写出更通用、健壮和可维护的代码
    2025-02-02
  • Rust 多线程编程的实现

    Rust 多线程编程的实现

    在rust中,多线程编程不算困难,但是也需要留心和别的编程语言中不同的地方,本文主要介绍了Rust 多线程编程的实现,感兴趣的可以了解一下
    2023-12-12
  • Rust字符串字面值的一些经验总结

    Rust字符串字面值的一些经验总结

    字符串有两种表现形式,一种是基本类型,表示字符串的切片,以&str表示,另一种是可变的string类型,下面这篇文章主要给大家介绍了关于Rust字符串字面值的相关资料,需要的朋友可以参考下
    2022-04-04
  • Rust 错误处理高级应用最佳实践

    Rust 错误处理高级应用最佳实践

    本文介绍了Rust错误处理模型,重点讲解了Result类型、自定义错误、错误传播与转换、错误链等概念,并以文件操作、网络请求、数据库操作为例展示了其实战应用,最后总结了最佳实践,通过学习,可以编写更加健壮、可维护的代码,感兴趣的朋友一起看看吧
    2026-04-04
  • Rust之Substrate框架中的pallet详解

    Rust之Substrate框架中的pallet详解

    Pallet是Substrate区块链的基础模块,它定义了区块链的业务逻辑和状态转换规则。开发人员可以使用现有的Pallet来快速构建区块链,也可以开发自定义的Pallet来实现特定的功能,感兴趣的小伙伴可以参考阅读下
    2023-05-05
  • 关于使用rust调用c++静态库并编译nodejs包的问题

    关于使用rust调用c++静态库并编译nodejs包的问题

    这篇文章主要介绍了使用rust调用c++静态库并编译nodejs包的问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • Rust并发编程之使用消息传递进行线程间数据共享方式

    Rust并发编程之使用消息传递进行线程间数据共享方式

    文章介绍了Rust中的通道(channel)概念,包括通道的基本概念、创建并使用通道、通道与所有权、发送多个消息以及多发送端,通道提供了一种线程间安全的通信机制,通过所有权规则确保数据安全,并且支持多生产者单消费者架构
    2025-02-02
  • Rust 中解析 JSON的方法

    Rust 中解析 JSON的方法

    要开始在 Rust 中使用 JSON,您需要安装一个可以轻松操作 JSON 的库,目前可用的流行crate之一是 serde-json,在本文中,我们将讨论如何在 Rust 中使用 JSON 解析库,以及比较最流行的库及其性能
    2024-03-03
  • 详解Rust中三种循环(loop,while,for)的使用

    详解Rust中三种循环(loop,while,for)的使用

    我们常常需要重复执行同一段代码,针对这种场景,Rust 提供了多种循环(loop)工具。一个循环会执行循环体中的代码直到结尾,并紧接着回到开头继续执行。而 Rust 提供了 3 种循环:loop、while 和 for,下面逐一讲解
    2022-09-09

最新评论