闭包

  • 闭包是一种特殊的匿名函数,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);
}