闭包

  • 闭包在Rust中是一种特型对象,无法像声明变量一样声明一个闭包变量
let f1:Fn(i32)->i32 = |x|{ x + 1}; //报错,因为Fn是无固定大小的trait,而变量都是固定大小的
  • 闭包是函数的抽象表现,是匿名的,常用作函数参数的约束
fn my_sort<T>(seed:Vec<i32>,sort:T) where T:Fn(Vec<i32>)->Vec<i32>{
	//sort是匿名函数,只要符合T:Fn(Vec<i32>)->Vec<i32>约束即可
}
  • 闭包无法作为函数的返回值
fn add_one()->Fn(i32)->i32{ //报错,因为无法用变量承接闭包
    |x|{x+1}
}
...
fn add_one()->Box<dyn  Fn(i32)->i32>{ //合法,使用Box指针包裹闭包
    Box::new(|x|->{x+1})
}
  • 闭包可以捕获外部变量
 let x = 1;
    fn add_one(y: i32) -> Box<dyn Fn() -> i32> {
        Box::new(|| { y + x })//闭包分别捕获了外部变量x和y
    }

函数

  • 函数在Rust中是一种类型,可以像声明变量一样声明函数
let f1:fn(i32)->i32 = |x|{ x + 1}; //声明一个名为f1的函数变量
  • 函数在Rust中是具名存在的
let f1:fn(i32)->i32 = |x|{ x + 1}; //声明一个名为f1的函数变量,函数名称为f1
...
fn add_one(x: i32) -> i32 { //函数名称为add_one
    x + 1
}
  • 函数可以作为另一个函数的返回值
fn add_one()->fn(i32)->i32{ //合法
    |x|{x+1}
}
  • 函数无法捕获外部变量
let x = 1;
fn add_one(y:i32){//报错,变量x为函数外部变量,函数内部无法访问
   y+x
}