Zrozumienie domknięć
Część sekcji Logika i przepływ sterowania ścieżki Dart w Coddy. Lekcja 46 z 65.
Domknięcie to szczególny rodzaj funkcji, która „pamięta” zmienne z miejsca, w którym została utworzona, nawet po zakończeniu działania pierwotnego kontekstu. Pomyśl o niej jak o funkcji, która zabiera ze sobą fragment miejsca swoich narodzin, dokądkolwiek się uda.
Gdy tworzysz funkcję wewnątrz innej funkcji, funkcja wewnętrzna ma dostęp do zmiennych funkcji zewnętrznej. Tym, co sprawia, że jest to domknięcie, jest to, że dostęp ten utrzymuje się nawet po zakończeniu wykonywania funkcji zewnętrznej.
Function createGreeting(String name) {
return () {
return "Hello, $name!";
};
}W tym przykładzie funkcja anonimowa zwrócona przez createGreeting jest domknięciem. Przechwytuje parametr name z otaczającego zakresu. Nawet po zakończeniu działania funkcji createGreeting zwrócona funkcja nadal pamięta, czym było name.
Domknięcia są niezwykle przydatne do tworzenia wyspecjalizowanych funkcji lub przechowywania stanu w przejrzysty sposób. Pozwalają tworzyć funkcje dostosowane do środowiska, w którym zostały utworzone, dzięki czemu Twój kod staje się bardziej elastyczny i potężniejszy.
Wyzwanie
ŁatwyUtwórz program, który demonstruje domknięcia, budując system generatora spersonalizowanych wiadomości. Twój program będzie tworzyć funkcje, które „zapamiętują” określone informacje i wykorzystują je do generowania spersonalizowanych wiadomości, nawet po zakończeniu działania pierwotnego kontekstu.
- Wczytaj ciąg znaków reprezentujący imię osoby
- Wczytaj ciąg znaków reprezentujący typ powitania (
"formal","casual"lub"friendly") - Wczytaj ciąg znaków reprezentujący nazwę firmy
- Utwórz funkcję o nazwie
createMessageGenerator, która przyjmuje imię i typ powitania jako parametry - Funkcja
createMessageGeneratorpowinna zwracać inną funkcję (domknięcie), która: - Przyjmuje nazwę firmy jako parametr
- Korzysta z imienia i typu powitania z zakresu funkcji zewnętrznej
- Zwraca sformatowaną wiadomość zależnie od typu powitania:
- Dla
"formal":"Dear [name], we are pleased to welcome you to [company]." - Dla
"casual":"Hey [name]! Welcome to [company]!" - Dla
"friendly":"Hi [name], so glad you joined [company]!" - Wywołaj funkcję
createMessageGenerator, przekazując jej imię i typ powitania, aby uzyskać funkcję będącą domknięciem - Wywołaj zwróconą funkcję będącą domknięciem, przekazując jej nazwę firmy, aby wygenerować wiadomość
- Wyświetl wyniki dokładnie w formacie pokazanym poniżej
Na przykład, jeśli dane wejściowe to "Alice", "formal" i "TechCorp", program powinien wyświetlić:
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 successfullyJeśli dane wejściowe to "Bob", "casual" i "StartupXYZ", program powinien wyświetlić:
Message Generator System
========================
Creating message generator for: Bob
Greeting type: casual
Company: StartupXYZ
========================
Generated message: Hey Bob! Welcome to StartupXYZ!
Message generation completed successfullyJeśli dane wejściowe to "Carol", "friendly" i "InnovateLab", program powinien wyświetlić:
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 successfullyTwój program musi demonstrować domknięcia, tworząc funkcję, która zwraca inną funkcję. Zwrócona funkcja (domknięcie) powinna mieć dostęp do zmiennych z zakresu funkcji zewnętrznej (imienia i typu powitania), nawet po zakończeniu jej działania. Użyj instrukcji warunkowych, aby określić odpowiedni format wiadomości na podstawie wczytanego typu powitania.
Spróbuj swoich sił
import 'dart:io';
void main() {
// Odczytaj dane wejściowe
String? name = stdin.readLineSync();
String? greetingType = stdin.readLineSync();
String? company = stdin.readLineSync();
// Wyświetl nagłówek systemowy
print("Message Generator System");
print("========================");
print("Creating message generator for: $name");
print("Greeting type: $greetingType");
print("Company: $company");
print("========================");
// TODO: Napisz swój kod poniżej
// Utwórz funkcję createMessageGenerator, która zwraca domknięcie
// Wywołaj funkcję i wygeneruj wiadomość
// Wyświetl końcowe wyniki
print("Generated message: \$message");
print("Message generation completed successfully");
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ sterowania
1Zaawansowana manipulacja listami
Właściwości listy: first i lastStan listy: isEmpty i isNotEmpOdwracanie listyDodawanie do listy: insertUsuwanie z listy: removeWhereWyszukiwanie na liście: indexOfSortowanie listyMieszanie elementów listyPodsumowanie – Organizator listy4Zaawansowane operacje na mapach
Iterowanie po mapieSprawdzanie kluczy i wartościWłaściwości mapy: klucze i wartościDodawanie warunkowe: putIfAbsentUsuwanie wpisów z mapyZagnieżdżone mapyPodsumowanie – aktualizacja stanu magazynowego2Operacje funkcyjne na listach
Przekształcanie za pomocą 'map'Filtrowanie za pomocą 'where'Używanie '.toList()'Sprawdzanie warunków za pomocą 'any'Warunki z użyciem 'every'Wyszukiwanie za pomocą 'firstWhere'Podsumowanie — filtrowanie danych5Projekt: Kalkulator koszyka zakupowego
Konfiguracja projektuDodawanie produktów do koszyka3Zbiory
Czym jest zbiór?Tworzenie zbioruDodawanie i usuwanie elementów ze zbiorówSprawdzanie, czy element znajduje się w zbiorzeKonwersja listy na zbiórSuma zbiorówCzęść wspólna zbiorówRóżnica zbiorówPodsumowanie — unikalna lista gościPoćwicz samodzielnie: Kompilator Dart online