Rust 的设计受到了多种现有语言和技术的影响,其中一个明显的影响来自函数式编程(functional programming)。函数式编程风格通常包括将函数作为参数传递给其他函数、将函数作为其他函数的返回值、以及将函数赋值给变量以供之后执行等等。Rust 中的闭包(closures)和高阶函数(higher-order functions)等功能正是受到了函数式编程的启发而引入的。这些功能使得 Rust 更具表现力和灵活性,同时也使得代码更易于编写和理解。
闭包的语法
fn add_one_v1 (x: u32) -> u32 {
x + 1 }
let add_one_v2 = |x: u32| -> u32 {
x + 1 };
let add_one_v3 = |x| {
x + 1 };
let add_one_v4 = |x| x + 1 ;
上面这四种方式都是有效的闭包定义,并在调用时产生相同的行为。
-
这是最常见的 Rust 函数定义方式,使用 fn 关键字定义了一个函数,并指定了函数的参数类型和返回类型。在函数体中,执行了一个简单的加法操作,将输入参数 x 加上 1,并将结果返回。
fn add_one_v1 (x: u32) -> u32 { x + 1 } -
这是通过闭包(|…| { … })的方式定义函数的一种方式。闭包使用垂直管道符 | 包围参数列表,并在大括号 {} 中定义函数体。这个闭包接受一个 u32 类型的参数 x,执行加法操作并返回结果。由于闭包的类型是由编译器推断出来的,因此在这里我们并没有明确指定返回类型,但是可以通过后面的箭头 -> 和返回类型来显式指定。
let add_one_v2 = |x: u32| -> u32 { x + 1 }; -
这是闭包的简化写法,在参数列表中省略了参数类型的声明。Rust 编译器会根据闭包体中的操作来推断参数类型。在这个闭包中,参数 x 的类型被推断为与闭包体中使用的类型相同,因为我们在闭包体中对 x 执行了加法操作。
let add_one_v3 = |x| { x + 1 }; -
这是闭包的更加简化的写法,省略了大括号 {} 和分号 ;。在这种情况下,闭包体只有一行代码,因此不需要大括号来定义代码块,而返回值就是闭包体中最后一个表达式的值。因此,这个闭包返回的值就是 x + 1 的结果。这种写法在简单情况下更加清晰和简洁。
let add_one_v4 = |x| x + 1 ;
闭包的实际应用
考虑以下假设情景:某企业提供一款通过应用程序生成自定义健身计划的服务。该服务的后端是使用 Rust 编写的,并且生成健身计划的算法需要考虑用户的年龄、身体质量指数(BMI)、用户的偏好、最近的健身活动以及用户指定的强度系数等多种因素。在这个示例中,实际的算法细节并不重要,关键是这个计算过程可能需要几秒钟的时间。我们希望只在需要时调用这个算法,并且希望仅调用一次,以避免让用户等待太长时间。
use std::thread; // 导入线程模块
use std::time::Duration; // 导入时间模块
fn main() {
let simulated_user_specified_value = 10; // 模拟用户指定的数值
let

文章介绍了Rust语言如何受到函数式编程影响,引入闭包和高阶函数,以增强代码的可读性和灵活性。通过实例展示了闭包的不同定义方式及其在生成自定义健身计划服务中的实际应用,以及Cacher结构体如何优化计算性能。
最低0.47元/天 解锁文章
1331

被折叠的 条评论
为什么被折叠?



