// 接受闭包作为参数的函数
fn multiply_with_closure(closure: impl Fn(f64, f64) -> f64) -> f64 {
closure(2.0, 3.0)
}
fn main() {
let result = multiply_with_closure(|a, b| a * b);
println!("计算结果: {}", result);
}
闭包在Rust中的作用
- 灵活的代码块传递:闭包允许将一段代码作为参数传递给其他函数,使得代码更加模块化和可复用。例如,在
multiply_with_closure
函数中,通过传递闭包来决定具体的乘法逻辑,提高了函数的通用性。
- 捕获环境变量:闭包可以捕获其定义时所在作用域中的变量。这使得闭包能够在不同的上下文中使用相同的逻辑,同时结合不同的环境数据。
闭包和普通函数的区别
- 语法:
- 闭包:使用
|参数列表| {代码块}
的语法定义,较为简洁。例如|a, b| a * b
。
- 普通函数:使用
fn函数名(参数列表) -> 返回类型 {代码块}
的语法定义,更加正式和详细。例如fn add(a: i32, b: i32) -> i32 { a + b }
。
- 捕获环境变量:
- 闭包:可以自动捕获其定义时所在作用域中的变量,形成一个“环境”。
- 普通函数:不能捕获环境变量,只能通过参数来接收外部数据。
- 类型推断:
- 闭包:闭包的类型通常由编译器根据上下文自动推断,开发者无需显式标注。
- 普通函数:函数的参数和返回类型都需要显式声明。
- 可调用性:
- 闭包:闭包实现了
Fn
、FnMut
、FnOnce
这三个trait之一,根据对环境变量的借用情况决定实现哪个trait。
- 普通函数:普通函数实现了
Fn
trait,可以直接调用。