初面网初面网

高阶函数

  • 接受一个或多个函数作为输入
  • 输出一个函数

下面的例子展示了函数作为参数传递的情况。

fn calc( method: fn(u8) -> u8, x: u8) -> u8 {
  method(x)
}

fn add_one(x: u8) -> u8 {
  x + 1
}

fn subtract_one(x: u8) -> u8 {
  x - 1
}

fn main(){
  let result_add = calc(add_one, 5);
  let result_subtract = calc(subtract_one, 5);

  println!("Result of adding one: {}", result_add); // Output: 6
  println!("Result of subtracting one: {}", result_subtract); // Output: 4
}

有时,函数作为参数,但是这个函数的参数很长,我们可以用type关键字替代整个函数的声明。

type Operation = fn(u8) -> u8;
fn calc( method: Operation, x: u8) -> u8 {
  method(x)
}

下面的例子展示函数作为返回值的情况。

fn create_multiplier(factor: u8) -> impl Fn(u8) -> u8 {
  move |x| x * factor
}

fn main(){
  let double = create_multiplier(2);
  let result = double(5);
  println!("{}", result); // Output: 10
}

下面是一个复杂用例,展示了函数和模式匹配的结合使用。

type Operation = fn(u8) -> u8;
fn calc( method: Operation, x: u8) -> u8 {
  match method {
    add_one => add_one(x),
    subtract_one => subtract_one(x),
    _ => x,
  }
}

fn add_one(x: u8) -> u8 {
  x + 1
}

fn subtract_one(x: u8) -> u8 {
  x - 1
}

fn main(){
  let result_add = calc(add_one, 5);
  let result_subtract = calc(subtract_one, 5);

  println!("Result of adding one: {}", result_add); // Output: 6
  println!("Result of subtracting one: {}", result_subtract); // Output: 4
}

更新于 2026/6/10