匿名函数
fn main() {
let add = |x, y| x + y;
let result = add(3, 4);
println!("Result: {}", result);
}
在这个例子中,|x, y| x + y 是一个匿名函数,它接受两个参数并返回它们的和。通过 let add = ... 将这个匿名函数赋值给 add 变量,然后可以像调用函数一样使用它。
具名函数
fn main() {
let multiply = |x, y| {
let result = x * y;
println!("Result: {}", result);
result
};
let product = multiply(5, 3);
println!("Product: {}", product);
}
在这个例子中,闭包包含了多个语句,类似于具名函数。multiply 是一个接受两个参数并返回它们的乘积的闭包。
闭包表达式
fn main() {
let square = |x| x * x;
let numbers = vec![1, 2, 3, 4];
let squared_numbers: Vec<_> = numbers.iter().map(|&x| square(x)).collect();
println!("{:?}", squared_numbers);
}
在这个例子中,map 方法接受一个闭包表达式 |&x| square(x),对 numbers 中的每个元素进行平方运算,然后将结果收集到一个新的向量中。
闭包可以捕获其环境中的变量,有三种捕获方式:
- FnOnce: 闭包获取其周围作用域的所有权,每个变量只能被闭包调用一次。
- FnMut: 闭包获取可变的借用,每个变量可以被闭包多次调用,但只能有一个可变的借用存在。
- Fn: 闭包获取不可变的借用,每个变量可以被闭包多次调用,且不存在可变的借用。
这是Rust中闭包的基本概念,你可以根据具体的需求选择不同类型的闭包和捕获方式。
转载请注明出处:http://www.pingtaimeng.com/article/detail/6805/Rust