函数可以作为参数传递吗?例如,在JavaScript中,您可以将函数作为参数传递,如下所示:
setInterval(function() { /*...*/ }, 1000);
Run Code Online (Sandbox Code Playgroud)
他们是一流的.与JavaScript相比,Rust有两种类型 - 函数和闭包.
fn first_class() {
println!("function");
}
fn higher_kinded<F: FnOnce()>(cb: F) {
cb();
}
fn main() {
higher_kinded(first_class); // passing function
higher_kinded(|| println!("closure")); // passing closure
}
Run Code Online (Sandbox Code Playgroud)
function() {}Rust中存在像JavaScript中的匿名函数,您可以使用闭包语法来定义它们
|arg, arg2, arg3| {
/* function body including optionally closed-over variables */
}
Run Code Online (Sandbox Code Playgroud)
请注意,参数和返回类型是推断的!
无论他们是否是头等舱,都需要更多的探索.默认情况下,函数会借用已关闭的变量.您可以使用move闭包指定将这些值移动到函数中:
let num = 5;
let plus_num = move |x: i32| x + num;
Run Code Online (Sandbox Code Playgroud)
重要的是,不引用其环境(包括move闭包)的闭包不需要引用创建它们的堆栈帧.由于它们的尺寸未知,因此它们本身不是一流的物体.
你可以Box封闭,并返回它作为一个特性对象Fn特质.
本文简要回答了本书中的内容,该内容解释了封闭装置是如何脱落以及它们如何与环境相互作用的.
| 归档时间: |
|
| 查看次数: |
3182 次 |
| 最近记录: |