Copyright © 2022-2024 aizws.net · 网站版本: v1.2.6·内部版本: v1.23.3·
页面加载耗时 0.00 毫秒·物理内存 71.9MB ·虚拟内存 1299.8MB
欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
Rust 中的闭包(closure),也叫做 lambda 表达式或者 lambda,是一类能够捕获周围 作用域中变量的函数。例如,一个可以捕获 x 变量的闭包如下:
|val| val + x
它们的语法和能力使它们在临时(on the fly)使用时相当方便。调用一个闭包和调用一个 函数完全相同,不过调用闭包时,输入和返回类型两者都可以自动推导,而输入变量 名必须指明。
其他的特点包括:
fn main() { // 通过闭包和函数分别实现自增。 // 译注:下面这行是使用函数的实现 fn function (i: i32) -> i32 { i + 1 } // 闭包是匿名的,这里我们将它们绑定到引用。 // 类型标注和函数的一样,不过类型标注和使用 `{}` 来围住函数体都是可选的。 // 这些匿名函数(nameless function)被赋值给合适地命名的变量。 let closure_annotated = |i: i32| -> i32 { i + 1 }; let closure_inferred = |i | i + 1 ; // 译注:将闭包绑定到引用的说法可能不准。 // 据[语言参考](https://doc.rust-lang.org/beta/reference/types.html#closure-types) // 闭包表达式产生的类型就是 “闭包类型”,不属于引用类型,而且确实无法对上面两个 // `closure_xxx` 变量解引用。 let i = 1; // 调用函数和闭包。 println!("function: {}", function(i)); println!("closure_annotated: {}", closure_annotated(i)); println!("closure_inferred: {}", closure_inferred(i)); // 没有参数的闭包,返回一个 `i32` 类型。 // 返回类型是自动推导的。 let one = || 1; println!("closure returning one: {}", one()); }
闭包天生就是灵活的,它会自动满足函数功能的要求,使得闭包不需要类型说明就可以工作。这允许变量捕获(capture)灵活地适应使用场合,既可移动(move)又可借用(borrow)变量。闭包可以通过以下手段捕获变量:通 ...