闭包 {#闭包}
- 闭包在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
}