一、前言
闭包在rust中非常常见,在前面多线程开发章节中我相信大家已经见识到,所以这里有必要对其进行详解介绍,
Rust中的闭包和C++中的lambda
表达式很像,它是一个可以保存在一个变量、或者作为一个参数传递给其它函数的匿名函数。
与普通函数的不同之处在于,它可以捕获所在作用域中的值。
二、简单使用
一个最简单的用例如下:
fn main() {
let f = |a: i32, b: i32| -> i32 {
return a + b;
};
let sum=f(10,20);
println!("{}",sum);
}
注意闭包的基本形式为:||{}
。
其中||
中放置参数,||
与{}
之间放置返回值,而{}
内则放置执行语句。
这样看起来,闭包似乎除了可以随用随写、能将其赋值到一个变量身上外,也没有其它特别之处了,就和普通函数差不多。
但这只是最原始的写法,为的是让大家方便与函数进行对照,这种写法在正常代码中并不常见。
毕竟我们用闭包的原因就是图它的简便,如果每次用闭包也要这么麻烦的话,那还不如用函数了。
三、闭包简化
首先是参数类型,由于我们闭包一般都是随写随用,所以rust编译器是能够根据后面代码的使用来自动推断出参数类型的,所以大多数时候我们都不必写参数类型:
然后是返回值,根据闭包函数体的返回值,它同样能推测出返回值类型,所以大多数时候依旧不用写。
但要注意,此时只能以表达式返回结果,而不能使用return
关键字:
这种将一个表达式放在最后直接作为函数返回值的写法,在rust中非常常见。
然后是函数体,由于大多数时候我们使用闭包的地方都是只需要执行一句代码、然后返回结果,所以这种情况下我们是不需要外面的{}
的:
现在是不是就非常的简单了?只需要一个||
就能完成闭包的书写,这可比写函数要简单多了。
而这种写法便是我们平常在代码中用的最多的写法,只不过这里还多了一个赋值操作,一般我们代码中是无需这样写的。
因为有些函数的参数就是一个函数,此时就只需要将整个闭包作为一个参数填进入即可:
fn main() {
let t = Some("test");
t.unwrap_or_else(|| "哈哈哈哈");
}