前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >28.Rust-闭包

28.Rust-闭包

原创
作者头像
面向加薪学习
修改2022-09-04 11:41:09
3730
修改2022-09-04 11:41:09
举报
文章被收录于专栏:面向加薪学习面向加薪学习

Rust 中的闭包(closure),也叫做 lambda 表达式或者 lambda,是一类能够捕获周围作用域中变量的函数。

调用一个闭包和调用一个函数完全相同,不过调用闭包时,输入和返回类型两者都可以自动推导,而输入变量名必须指明。

其他的特点包括:

  • 声明时使用 || 替代 () 将输入参数括起来。
  • 函数体定界符({})对于单个表达式是可选的,其他情况必须加上。
  • 有能力捕获外部环境的变量。

定义闭包

代码语言:txt
复制
普通函数
fn 函数名(参数列表) -> 返回值 {
   // 业务逻辑
}

// 闭包
|参数列表| {
	// 业务逻辑
}
// 无参数闭包
|| {
	// 业务逻辑
}

从上面看,去掉了 fn,去掉了函数名,把参数用 2 个竖线。

闭包也可以赋值给一个变量,可以通过调用这个变量来完成闭包的调用。

代码语言:txt
复制
let 闭包变量 = |参数列表| {
   // 闭包的具体逻辑
}
代码语言:txt
复制
    let double = |x| { x * 2 };

    let add = |a, b| { a + b };
    let x = add(2, 4);
    println!("{}", x);

    let y = double(5);
    println!("{}", y);

    let v = 3;
    let add2 = |x| { v + x };
    println!("{}", add2(4));
    //输出
    6
		10
		7

捕获

闭包本质上很灵活,闭包可以在没有类型标注的情况下运行。可移动(move),又可借用(borrow)。闭包可以通过以下方式捕获变量:

  • 通过引用:&T
  • 通过可变引用:&mut T
  • 通过值:T

总结

  • 闭包就是在一个函数内创建立即调用的另一个函数。
  • 闭包是一个匿名函数。
  • 闭包虽然没有函数名,但可以把整个闭包赋值一个变量,通过调用该变量来完成闭包的调用。
  • 闭包不用声明返回值,但它却可以有返回值。并且使用最后一条语句的执行结果作为返回值。闭包的返回值可以赋值给变量。
  • 闭包又称之为 内联函数。可以让闭包访问外层函数里的变量。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 定义闭包
  • 捕获
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档