Menu
Coddy logo textTech

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

Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 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 должна перебирать входной список, применять заданную функцию к каждому элементу и собирать результаты в новый список.

Шпаргалка

Функции высшего порядка — это функции, которые могут принимать другие функции в качестве параметров, обеспечивая гибкость и возможность повторного использования кода.

Чтобы передать функцию в качестве аргумента, определите параметр типа Function:

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

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

Попробуйте сами

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Проверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком