Rust中的函数是第一类对象吗?

时间:2014-07-26 15:07:06

标签: rust

函数可以作为参数传递吗?例如,在JavaScript中,您可以将函数作为参数传递,如下所示:

setInterval(function() { /*...*/ }, 1000);

3 个答案:

答案 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);