В 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, ×2);
}
Но это 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
здесь тип указателя функции.
Если вам не требуется полноценное закрытие, чем работа с типами функций, часто бывает проще, так как ему не нужно иметь дело с этими укорачиваниями времени жизни.