Понимание замыканий
Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 46 из 65.
Замыкание — это особый тип функции, которая «запоминает» переменные из того места, где она была создана, даже после того, как исходный контекст завершил свое выполнение. Представьте это как функцию, которая носит с собой частичку места своего рождения, куда бы она ни отправилась.
Когда вы создаете функцию внутри другой функции, внутренняя функция имеет доступ к переменным внешней функции. Замыканием это делает то, что этот доступ сохраняется даже после того, как внешняя функция завершила свое выполнение.
Function createGreeting(String name) {
return () {
return "Hello, $name!";
};
}В этом примере анонимная функция, возвращаемая createGreeting, является замыканием. Она захватывает параметр name из своей внешней области видимости. Даже после того, как createGreeting завершает выполнение, возвращаемая функция все еще помнит, каким было значение name.
Замыкания невероятно полезны для создания специализированных функций или чистого управления состоянием. Они позволяют создавать функции, которые настраиваются в зависимости от окружения, в котором они были созданы, что делает ваш код более гибким и мощным.
Задание
ЛегкоСоздайте программу, которая демонстрирует замыкания (closures), создавая систему генерации персонализированных сообщений. Ваша программа будет создавать функции, которые «запоминают» определенную информацию и используют ее для создания настроенных сообщений даже после того, как исходный контекст завершил выполнение.
- Считайте строковый ввод, представляющий имя человека
- Считайте строковый ввод, представляющий тип приветствия (
"formal","casual"или"friendly") - Считайте строковый ввод, представляющий название компании
- Создайте функцию с именем
createMessageGenerator, которая принимает имя и тип приветствия в качестве параметров - Функция
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]!" - Вызовите функцию
createMessageGeneratorс введенными именем и типом приветствия, чтобы получить функцию-замыкание - Вызовите возвращенную функцию-замыкание с введенным названием компании для генерации сообщения
- Выведите результаты в точном формате, показанном ниже
Например, если входные данные — "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");
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутая работа со списками
Свойства списка: first и lastСостояние списка: isEmpty и isNotEmptyРазворот спискаДобавление в список: insertУдаление из списка: removeWhereПоиск в списке: indexOfСортировка спискаПеремешивание спискаИтоги — Органайзер списков4Продвинутая работа с Map
Итерация по MapПроверка ключей и значенийСвойства Map: keys и valuesУсловное добавление: putIfAbsentУдаление записей из MapВложенные MapИтоги — Обновление инвентаря2Функциональные операции со списками
Преобразование с помощью 'map'Фильтрация с помощью 'where'Использование '.toList()'Проверка условий с помощью 'any'Условия с 'every'Поиск с помощью 'firstWhere'Повторение — фильтрация данных5Проект: Калькулятор корзины
Настройка проектаДобавление товаров в корзину3Множества
Что такое множество?Создание множестваДобавление и удаление элементовПроверка наличия элементов в множествеПреобразование списка в множествоОбъединение множествПересечение множествРазность множествИтоги: уникальный список гостей