Menu
Coddy logo textTech

Понимание замыканий

Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 46 из 65.

Замыкание — это особый тип функции, которая «запоминает» переменные из того места, где она была создана, даже после того, как исходный контекст завершил свое выполнение. Представьте это как функцию, которая носит с собой частичку места своего рождения, куда бы она ни отправилась.

Когда вы создаете функцию внутри другой функции, внутренняя функция имеет доступ к переменным внешней функции. Замыканием это делает то, что этот доступ сохраняется даже после того, как внешняя функция завершила свое выполнение.

Function createGreeting(String name) {
  return () {
    return "Hello, $name!";
  };
}

В этом примере анонимная функция, возвращаемая createGreeting, является замыканием. Она захватывает параметр name из своей внешней области видимости. Даже после того, как createGreeting завершает выполнение, возвращаемая функция все еще помнит, каким было значение name.

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

challenge icon

Задание

Легко

Создайте программу, которая демонстрирует замыкания (closures), создавая систему генерации персонализированных сообщений. Ваша программа будет создавать функции, которые «запоминают» определенную информацию и используют ее для создания настроенных сообщений даже после того, как исходный контекст завершил выполнение.

  1. Считайте строковый ввод, представляющий имя человека
  2. Считайте строковый ввод, представляющий тип приветствия ("formal", "casual" или "friendly")
  3. Считайте строковый ввод, представляющий название компании
  4. Создайте функцию с именем createMessageGenerator, которая принимает имя и тип приветствия в качестве параметров
  5. Функция createMessageGenerator должна возвращать другую функцию (замыкание), которая:
    • Принимает название компании в качестве параметра
    • Использует имя и тип приветствия из области видимости внешней функции
    • Возвращает отформатированное сообщение в зависимости от типа приветствия:
      • Для "formal": "Dear [name], we are pleased to welcome you to [company]."
      • Для "casual": "Hey [name]! Welcome to [company]!"
      • Для "friendly": "Hi [name], so glad you joined [company]!"
  6. Вызовите функцию createMessageGenerator с введенными именем и типом приветствия, чтобы получить функцию-замыкание
  7. Вызовите возвращенную функцию-замыкание с введенным названием компании для генерации сообщения
  8. Выведите результаты в точном формате, показанном ниже

Например, если входные данные — "Alice", "formal" и "TechCorp", ваша программа должна вывести:

Message Generator System
========================
Creating message generator for: Alice
Greeting type: formal
Company: TechCorp
========================
Generated message: Dear Alice, we are pleased to welcome you to TechCorp.
Message generation completed successfully

Если входные данные — "Bob", "casual" и "StartupXYZ", ваша программа должна вывести:

Message Generator System
========================
Creating message generator for: Bob
Greeting type: casual
Company: StartupXYZ
========================
Generated message: Hey Bob! Welcome to StartupXYZ!
Message generation completed successfully

Если входные данные — "Carol", "friendly" и "InnovateLab", ваша программа должна вывести:

Message Generator System
========================
Creating message generator for: Carol
Greeting type: friendly
Company: InnovateLab
========================
Generated message: Hi Carol, so glad you joined InnovateLab!
Message generation completed successfully

Ваша программа должна демонстрировать замыкания, создавая функцию, которая возвращает другую функцию. Возвращаемая функция (замыкание) должна иметь доступ к переменным из области видимости внешней функции (имя и тип приветствия) даже после того, как внешняя функция завершила выполнение. Используйте условные операторы для определения соответствующего формата сообщения на основе введенного типа приветствия.

Шпаргалка

Замыкание — это функция, которая «запоминает» переменные из того места, где она была создана, даже после того, как исходный контекст завершил свое выполнение.

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

Function createGreeting(String name) {
  return () {
    return "Hello, $name!";
  };
}

В этом примере анонимная функция, возвращаемая createGreeting, является замыканием. Она захватывает параметр name из своей окружающей области видимости. Даже после того, как createGreeting завершает работу, возвращаемая функция все еще помнит, каким было значение name.

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

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

import 'dart:io';

void main() {
  // Чтение входных данных
  String? name = stdin.readLineSync();
  String? greetingType = stdin.readLineSync();
  String? company = stdin.readLineSync();
  
  // Отображение заголовка системы
  print("Message Generator System");
  print("========================");
  print("Creating message generator for: $name");
  print("Greeting type: $greetingType");
  print("Company: $company");
  print("========================");
  
  // TODO: Напишите свой код ниже
  // Создайте функцию createMessageGenerator, которая возвращает замыкание
  // Вызовите функцию и сгенерируйте сообщение
  
  // Вывод финальных результатов
  print("Generated message: \$message");
  print("Message generation completed successfully");
}
quiz iconПроверьте себя

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

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