В Rust, как вы передаете функцию в качестве параметра?

Могу ли я передать функцию в качестве параметра в Rust (возможно, да), если это возможно, как я могу сделать.

Если вы не можете, это хорошая альтернатива.

Я пробовал некоторый синтаксис, но я не получил


Я знаю, что могу это сделать

..//

let fun: fn(value: i32) -> i32;
fun = funTest;
fun(5i32);

..//
fn funTest(value: i32) -> i32 {
    println!("{}", value);
    value
}

но не как передача функции в качестве параметра другой функции

..//
fn funTest(value: i32, (some_function_prototype)) -> i32 {
    println!("{}", value);
    value
}

Ответ 1

Конечно, вы можете:

fn funTest(value: i32, f: &Fn(i32) -> i32) -> i32 {
    println!("{}", f(value));
    value
}

fn times2(value: i32) -> i32 {
    2 * value
}

fn main() {
    funTest(5, &times2);
}

Но это Rust, поэтому вам нужно принять во внимание право собственности и срок действия закрытия.

TL; DR; В основном существует 3 типа закрытий (вызываемые объекты):

  • Fn: Самый общий, это чистая функция.
  • FnMut: он может изменять объекты, которые он захватывает.
  • FnOnce: Самый ограниченный. Может быть вызван только один раз, потому что, когда он называется, он потребляет себя и свои захваты.

Если вы используете простой указатель на функцию, например, закрытие, тогда набор захвата пуст и у вас есть аромат Fn.

Если вы хотите сделать больше причудливых вещей, вам придется использовать лямбда-функции.

Ответ 2

Fn, FnMut и FnOnce, описанные в другом ответе, являются типами закрытия. Типы функций, которые закрываются по своему охвату.

Помимо пропущенных замыканий, Rust также поддерживает прохождение простых (не замыкающих) функций, например:

fn times2(value: i32) -> i32 {
    2 * value
}

fn fun_test(value: i32, f: fn(i32) -> i32) -> i32 {
    println!("{}", f (value));
    value
}

fn main() {
    fun_test (2, times2);
}

fn(i32) -> i32 здесь тип указателя функции.

Если вам не требуется полноценное закрытие, чем работа с типами функций, часто бывает проще, так как ему не нужно иметь дело с этими укорачиваниями времени жизни.