rust 高阶,闭包、迭代器

78 阅读3分钟

闭包(Closure)

Rust语言中的闭包(Closure)是一种特殊的函数,它可以捕获其环境中的变量,并在其定义之外的地方使用这些变量。闭包在Rust中广泛应用于各种场景,如迭代器、函数式编程等。

一、闭包的基本概念

闭包的语法如下:

|param1, param2,...| {
    语句1;
    语句2;
    返回表达式 // 闭包中最后一行表达式返回的值,就是闭包执行后的返回值
}

// 如果只有一个返回表达式,可以用
|param1| 返回表达式

// 闭包前加上move关键字,表示把变量的所有权从当前作用域移动到闭包的作用域
move |param1, param2,...| {
    语句1;
    语句2;
    返回表达式 
}

二、闭包的类型

Rust中的闭包可以分为两种类型:常规闭包和捕获闭包。

  1. 常规闭包

常规闭包是一种不带任何类型注解的闭包,它可以根据其环境自动推断其类型。常规闭包在定义时不需要指定其类型,而是在使用时由编译器自动推断。

例如:

	let add = |x, y| x + y;  
	let result = add(3, 4); // result的值为7

在这个例子中,add是一个常规闭包,它根据其环境推断出其类型为(int, int) -> int,即接受两个整数参数并返回一个整数的函数。

  1. 捕获闭包

捕获闭包是一种带有类型注解的闭包,需要明确指定其输入和输出的类型。捕获闭包可以捕获其环境中的变量,并将其作为输入传递给闭包体中的代码。

例如:

	let x = 5;  
	let square = |x| (x * x); // 捕获了环境中的x变量  
	let result = square(x); // 传递捕获的x变量给square闭包体执行

在这个例子中,square是一个捕获闭包,它明确地捕获了其环境中的变量x,并指定了输入类型为int,输出类型为int。在定义square闭包时,需要使用类型注解来指定输入和输出的类型。

三、闭包的使用场景

闭包在Rust中有很多使用场景,下面我们介绍几个常见的例子。

  1. 迭代器

闭包在Rust的迭代器中广泛应用。通过定义一个返回迭代器类型的闭包,可以实现对数据的迭代操作。例如,下面是一个使用闭包实现整数列表迭代的示例:

	let numbers = [1, 2, 3, 4, 5];  
	let sum = numbers.iter().map(|&x| x * x).sum();  
	println!("{}", sum); // 输出155

在这个例子中,我们使用map方法对整数列表进行映射操作。map方法的参数是一个闭包,它接受一个整数引用作为输入,并返回该整数的平方作为输出。然后,使用sum方法对映射结果进行求和,得到最终的结果。

  1. 函数式编程

闭包是函数式编程的重要概念之一。通过定义一系列的闭包,可以实现一系列的函数式操作。例如,下面是一个使用闭包实现函数式编程的示例:

	fn main() {  
	    let a = 5;  
	    let b = 10;  
	    let add = |x, y| x + y; // 常规闭包  
	    let result = add(a, b); // result的值为15  
	    println!("{}", result);  

	}