Menu
CoddyTech

将函数作为参数传递

本课属于 Coddy Dart 学习旅程的“逻辑与流程控制”单元。第 45 课,共 65 课。

在编程中,函数不仅可以接受数字或字符串这样的简单值,还可以将其他函数作为参数。这个强大的概念称为高阶函数,它为编写灵活、可重复使用的代码开辟了全新的方式。

将函数作为参数传递时,本质上是让另一个函数决定要执行什么操作。你可以把它想象成给别人一件工具,让他们选择如何用它处理不同的材料。

void processNumbers(List<int> numbers, Function operation) {
  for (int number in numbers) {
    operation(number);
  }
}

在这个示例中,processNumbers 将一个列表和一个函数作为参数。函数参数 operation 可以是任何接受整数的函数。这意味着你可以传入一个打印数字、将数字加倍或执行任何其他所需操作的函数。

这种方法让你的代码变得非常灵活:你不必为每种可能的操作分别编写函数,而是编写一个函数,通过接受不同的操作作为参数来完成这些操作。

challenge icon

挑战

简单

创建一个程序,通过构建灵活的数字处理器来演示如何将函数作为参数传递。你的程序会创建不同的处理函数,并将它们传递给一个主处理函数,由它对数字列表执行操作。

  1. 读取一个字符串输入,其中的数字以逗号分隔(例如,"1,2,3,4,5")
  2. 读取一个表示操作类型的字符串输入("double"、"square" 或 "increment")
  3. 将第一个输入拆分为字符串列表,并将每个字符串转换为整数
  4. 创建三个独立的函数:
    • doubleNumber:接收一个整数,并返回它乘以 2 的结果
    • squareNumber:接收一个整数,并返回它与自身相乘的结果
    • incrementNumber:接收一个整数,并返回它加 1 的结果
  5. 创建一个名为 processNumbers 的主函数,它接收一个整数列表和一个函数作为参数
  6. processNumbers 函数应对列表中的每个数字应用给定的函数,并返回一个包含结果的新列表
  7. 根据操作类型输入,将相应的函数传递给 processNumbers
  8. 按照下方所示的准确格式显示结果

例如,如果输入是 "2,4,6,8" 和 "double",你的程序应输出:

Number Processor
================
Original numbers: [2, 4, 6, 8]
Operation: double
Processing numbers...
Result: [4, 8, 12, 16]
Operation completed successfully

如果输入是 "3,5,7" 和 "square",你的程序应输出:

Number Processor
================
Original numbers: [3, 5, 7]
Operation: square
Processing numbers...
Result: [9, 25, 49]
Operation completed successfully

如果输入是 "10,20,30" 和 "increment",你的程序应输出:

Number Processor
================
Original numbers: [10, 20, 30]
Operation: increment
Processing numbers...
Result: [11, 21, 31]
Operation completed successfully

你的程序必须通过将三个操作函数之一作为参数传递给 processNumbers 函数,来演示高阶函数的概念。使用条件语句,根据操作类型输入确定要传递哪个函数。processNumbers 函数应遍历输入列表,对每个元素应用给定的函数,并将结果收集到一个新列表中。

亲手试试

import 'dart:io';

void main() {
  // 读取输入
  String? numbersInput = stdin.readLineSync();
  String? operation = stdin.readLineSync();
  
  // 将输入的字符串转换为整数列表
  List<int> numbers = numbersInput!.split(',').map((e) => int.parse(e.trim())).toList();
  
  // TODO: 创建三个运算函数(doubleNumber、squareNumber、incrementNumber)
  
  // TODO: 创建 processNumbers 函数,接收一个列表和一个函数作为参数
  
  // TODO: 使用条件语句,根据运算类型确定要传入哪个函数
  
  // TODO: 调用 processNumbers,传入合适的函数并保存结果
  
  // 按要求的格式输出结果
  print('Number Processor');
  print('================');
  print('Original numbers: $numbers');
  print('Operation: $operation');
  print('Processing numbers...');
  // TODO: 在这里打印结果列表
  print('Operation completed successfully');
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程控制中的所有课

自己练习: Dart 在线编译器