目录
什么是 Rust 闭包
Rust 闭包 (Closures) 是一种匿名函数,可以捕获其定义时的环境变量。它们使用 |参数| 表达式
语法定义,支持灵活的函数式编程风格,常用于迭代器和高阶函数。
为什么要使用闭包
- 捕获环境:访问外部作用域的变量。
- 简洁性:无需显式定义命名函数。
- 函数式编程:与迭代器、映射等操作结合。
- 动态性:支持运行时生成的逻辑。
闭包的定义与语法
- 基本语法:
|参数| 表达式
。 - 类型推导:参数和返回值类型通常由编译器推断。
- 显式类型:可使用
|参数: 类型| -> 返回类型 { 代码块 }
。
let add_one = |x| x + 1;
闭包的捕获方式
闭包根据捕获外部变量的方式实现以下 trait:
Fn
:
- 不可变借用环境(
&self
)。 - 可多次调用。
FnMut
:
- 可变借用环境(
&mut self
)。 - 可修改捕获的变量。
FnOnce
:
- 消费环境(
self
)。 - 只能调用一次,转移所有权。
- 捕获规则:
- 默认尽量借用(
&
)。 - 使用
move
关键字强制转移所有权。
闭包与函数的区别
- 环境捕获:闭包可捕获外部变量,函数不行。
- 匿名性:闭包无需命名。
- 类型:闭包是唯一类型,函数是具名类型。
- 性能:闭包可能有轻微开销(捕获环境)。
代码示例
基本闭包
fn main() {
let base = 10;
let add_base = |x| x + base; // 捕获 base
println!("5 + base = {}", add_base(5));
}
运行结果:
5 + base = 15
不同捕获方式
fn main() {
let mut count = 0;
// Fn: 不可变借用
let print_count = || println!("Count: {}", count);
print_count();
// FnMut: 可变借用
let mut increment = || count += 1;
increment();
println!("After increment: {}", count);
// FnOnce: 消费所有权
let value = String::from("Rust");
let consume = move || println!("Consumed: {}", value);
consume();
// println!("{}", value); // 错误:value 已转移
}
运行结果:
Count: 0
After increment: 1
Consumed: Rust
闭包与迭代器
fn main() {
let numbers = vec![1, 2, 3, 4];
let doubled: Vec<i32> = numbers.into_iter()
.map(|x| x * 2)
.collect();
println!("Doubled: {:?}", doubled);
}
运行结果:
Doubled: [2, 4, 6, 8]
参考资料与出站链接
- 官方文档:
- 学习资源:
- 社区支持:
发表回复