Являются ли функции в объектах первого класса Rust?

Можно ли передавать функции в качестве аргументов? Например, в JavaScript вы можете передать функцию в качестве аргумента следующим образом:

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

Ответ 1

Анонимные функции, такие как function() {} в JavaScript, существуют в Rust, и вы можете определить их с помощью синтаксиса закрытия

|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.

Этот ответ содержит краткое описание того, что в книга, в которой объясняется, как закрываются блокировки и как они взаимодействуют с окружающей средой.

Ответ 2

Они первого класса. В отличие от 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
}

Ответ 3

Похоже, что это так, как описано в справочном руководстве.

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