13. rust闭包详解

一、前言

闭包在rust中非常常见,在前面多线程开发章节中我相信大家已经见识到,所以这里有必要对其进行详解介绍,

Rust中的闭包和C++中的lambda表达式很像,它是一个可以保存在一个变量、或者作为一个参数传递给其它函数的匿名函数。

与普通函数的不同之处在于,它可以捕获所在作用域中的值。

二、简单使用

一个最简单的用例如下:

fn main() {
    let f = |a: i32, b: i32| -> i32 {
        return a + b;
    };
    let sum=f(10,20);
    println!("{}",sum);
}

注意闭包的基本形式为:||{}

其中||中放置参数,||{}之间放置返回值,而{}内则放置执行语句。

这样看起来,闭包似乎除了可以随用随写、能将其赋值到一个变量身上外,也没有其它特别之处了,就和普通函数差不多。

但这只是最原始的写法,为的是让大家方便与函数进行对照,这种写法在正常代码中并不常见。

毕竟我们用闭包的原因就是图它的简便,如果每次用闭包也要这么麻烦的话,那还不如用函数了。

三、闭包简化

首先是参数类型,由于我们闭包一般都是随写随用,所以rust编译器是能够根据后面代码的使用来自动推断出参数类型的,所以大多数时候我们都不必写参数类型:

image-20231217141645612

然后是返回值,根据闭包函数体的返回值,它同样能推测出返回值类型,所以大多数时候依旧不用写。

但要注意,此时只能以表达式返回结果,而不能使用return关键字:

image-20231217142117620

这种将一个表达式放在最后直接作为函数返回值的写法,在rust中非常常见。

然后是函数体,由于大多数时候我们使用闭包的地方都是只需要执行一句代码、然后返回结果,所以这种情况下我们是不需要外面的{}的:

image-20231217142230951

现在是不是就非常的简单了?只需要一个||就能完成闭包的书写,这可比写函数要简单多了。

而这种写法便是我们平常在代码中用的最多的写法,只不过这里还多了一个赋值操作,一般我们代码中是无需这样写的。

因为有些函数的参数就是一个函数,此时就只需要将整个闭包作为一个参数填进入即可:

fn main() {
    let t = Some("test");
    t.unwrap_or_else(|| "哈哈哈哈");
}
作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux