闭包
-
闭包是一种特殊的匿名函数,rust 中声明形式为|x|{x},或者|x|->{x};前段部分|x|为参数部分,代表传入参数 x。后段部分{}代表函数体,示例中为返回 x 的值。
-
可以手动声明闭包的变量类型(推荐),如 |x:i32|{y:f64},当然,编译器的功能也是很强大的,很多情况下会自行推断
以下展示闭包的基本用法
正确用法
fn main() { let x = |a,b|->i32{return a+b}; //定义闭包,传入参数a,b,返回a+b的值 println!("{:?}",x(1,2)); }
- 当 rust 函数中第一次调用闭包时,此闭包的的参数类型会被确定下来。(当然,配合特征变量可以实现对符合特征的变量做统一操作)
错误用法
fn main() { let x = |a,b|{return a+b}; //定义闭包,传入参数a,b,返回a+b的值 println!("{}",x(1,2)); println!("{}",x(1.0,2.0));//此处报错 }
这里的闭包被编译器检查后认定是|a:i32,b:i32|->i32,所以无法再接受 f64 类型的参数。而且编译器在此情况下不会将两个参数类型一起考虑,将变量类型归类为特征变量。后续添加特殊实现方法,让闭包可以支持多种类型。
- 与普通函数仅能接收传入的指定参数不同,闭包可以捕获其所在环境中的变量,这些变量可以在闭包内部使用,也可以在闭包外部修改。 闭包能捕获的范围是当前闭包声明函数出现之前的变量
正确示范
fn main(){ let outside = 1; let x =|a|{println!("{}",outside+a)}; x(1); }
错误示范
fn main(){ //这里改变声明顺序,然后报错 let x =|a|{println!("{}",outside+a)}; let outside = 1; x(1); }