函数可以作为参数传递吗?例如,在JavaScript中,您可以将函数作为参数传递,如下所示:
setInterval(function() { /*...*/ }, 1000);
答案 0 :(得分:9)
Rust中存在JavaScript中的function() {}
等匿名函数,您可以使用闭包语法定义它们
|arg, arg2, arg3| {
/* function body including optionally closed-over variables */
}
请注意,推断出了参数和返回类型!
他们是否是一流的,需要多一点探索。
默认情况下,函数会借用已关闭的变量。您可以使用move
闭包指定将这些值移动到函数中:
let num = 5;
let plus_num = move |x: i32| x + num;
重要的是,不引用其环境的闭包(包括move
闭包)不需要引用创建它们的堆栈帧。由于它们的尺寸不为人所知,它们本身并不是一流的物体。
你可以Box
一个闭包并将其作为Fn
trait的特征对象返回。
这回答了the book中的内容的简要总结,其中解释了如何关闭封闭以及它们如何与环境互动。
答案 1 :(得分:8)
他们是一流的。与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
}
答案 2 :(得分:-1)
似乎就是这种情况,如参考手册中的described。
fn add(x: int, y: int) -> int {
return x + y;
}
let mut x = add(5,7);
type Binop<'a> = |int,int|: 'a -> int;
let bo: Binop = add;
x = bo(5,7);
它还尝试了以下方法,它以相同的方式传递闭包和函数:
fn myproc(val: int) {
println!("{}", val*10);
}
fn call_func(func: |int| -> ()) {
func(3);
}
…
call_func(|x| {println!("{}", x)});
call_func(myproc);