Можно ли передавать функции в качестве аргументов? Например, в JavaScript вы можете передать функцию в качестве аргумента следующим образом:
setInterval(function() { /*...*/ }, 1000);
Можно ли передавать функции в качестве аргументов? Например, в JavaScript вы можете передать функцию в качестве аргумента следующим образом:
setInterval(function() { /*...*/ }, 1000);
Анонимные функции, такие как 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.
Этот ответ содержит краткое описание того, что в книга, в которой объясняется, как закрываются блокировки и как они взаимодействуют с окружающей средой.
Они первого класса. В отличие от 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
}
Похоже, что это так, как описано в справочном руководстве.
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);