Closure'ları Anlamak
Coddy'nin Dart Journey'sinin Mantık & Akış bölümünün bir parçası. Ders 46 / 65.
Closure, oluşturulduğu yerdeki değişkenleri, o özgün bağlamın çalışması sona erdikten sonra bile “hatırlayan” özel bir işlev türüdür. Onu, doğduğu yerin bir parçasını gittiği her yere yanında taşıyan bir işlev olarak düşünebilirsin.
Bir işlevi başka bir işlevin içinde oluşturduğunuzda, içteki işlev dıştaki işlevin değişkenlerine erişebilir. Bu erişimin, dıştaki işlev yürütmesini tamamladıktan sonra bile sürmesi, bunu bir closure yapan şeydir.
Function createGreeting(String name) {
return () {
return "Hello, $name!";
};
}Bu örnekte, createGreeting tarafından döndürülen anonim işlev bir closure'dır. Çevresindeki kapsamdan name parametresini yakalar. createGreeting çalışmasını tamamladıktan sonra bile döndürülen işlev name'in ne olduğunu hâlâ hatırlar.
Closures, özelleştirilmiş işlevler oluşturmak veya durumu temiz bir şekilde korumak için inanılmaz derecede kullanışlıdır. Oluşturuldukları ortama göre özelleştirilmiş işlevler oluşturmanıza olanak tanıyarak kodunuzu daha esnek ve güçlü hâle getirirler.
Görev
KolayKapanışları, kişiselleştirilmiş bir mesaj oluşturucu sistemi kurarak gösteren bir program oluştur. Programın, belirli bilgileri "hatırlayan" ve özgün bağlam tamamlandıktan sonra bile bu bilgileri kullanarak özelleştirilmiş mesajlar oluşturan işlevler yaratmalıdır.
- Bir kişinin adını temsil eden bir dize girdisi oku
- Bir selamlama türünü (
"formal","casual"veya"friendly") temsil eden bir dize girdisi oku - Bir şirket adını temsil eden bir dize girdisi oku
- Parametre olarak bir ad ve selamlama türü alan
createMessageGeneratoradlı bir işlev oluştur createMessageGeneratorişlevi, şunları yapan başka bir işlevi (bir kapanış) döndürmelidir:- Parametre olarak bir şirket adı alır
- Dış işlevin kapsamındaki adı ve selamlama türünü kullanır
- Selamlama türüne göre biçimlendirilmiş bir mesaj döndürür:
"formal"için:"Dear [name], we are pleased to welcome you to [company].""casual"için:"Hey [name]! Welcome to [company]!""friendly"için:"Hi [name], so glad you joined [company]!"- Kapanış işlevini elde etmek için
createMessageGeneratorişlevini ad ve selamlama türü girdileriyle çağır - Mesajı oluşturmak için döndürülen kapanış işlevini şirket adı girdisiyle çağır
- Sonuçları aşağıda gösterilen tam biçimde görüntüle
Örneğin girdiler "Alice", "formal" ve "TechCorp" ise programın şu çıktıyı vermelidir:
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 successfullyGirdiler "Bob", "casual" ve "StartupXYZ" ise programın şu çıktıyı vermelidir:
Message Generator System
========================
Creating message generator for: Bob
Greeting type: casual
Company: StartupXYZ
========================
Generated message: Hey Bob! Welcome to StartupXYZ!
Message generation completed successfullyGirdiler "Carol", "friendly" ve "InnovateLab" ise programın şu çıktıyı vermelidir:
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 successfullyProgramın, başka bir işlev döndüren bir işlev oluşturarak kapanışları göstermelidir. Döndürülen işlev (kapanış), dış işlev çalışmasını tamamladıktan sonra bile dış işlevin kapsamındaki değişkenlere (ad ve selamlama türü) erişebilmelidir. Selamlama türü girdisine göre uygun mesaj biçimini belirlemek için koşullu ifadeler kullan.
Kendin dene
import 'dart:io';
void main() {
// Girdiyi oku
String? name = stdin.readLineSync();
String? greetingType = stdin.readLineSync();
String? company = stdin.readLineSync();
// Sistem başlığını görüntüle
print("Message Generator System");
print("========================");
print("Creating message generator for: $name");
print("Greeting type: $greetingType");
print("Company: $company");
print("========================");
// TODO: Kodunuzu aşağıya yazın
// Create the createMessageGenerator function that returns a closure
// Fonksiyonu çağırın ve mesajı oluşturun
// Sonuçları yazdır
print("Generated message: \$message");
print("Message generation completed successfully");
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık & Akış bölümündeki tüm dersler
1İleri Düzey Liste İşlemleri
Liste Özellikleri: first & lastListe Durumu: isEmpty & isNotEmptyBir Listeyi Tersine ÇevirmeListeye Ekleme: insertListeden Silme: removeWhereListede Bulma: indexOfBir Listeyi SıralamaBir Listeyi KarıştırmaÖzet - Liste Düzenleyici4İleri Seviye Map İşlemleri
Map Üzerinde GezinmeAnahtar ve Değer KontrolüMap Özellikleri: keys & valuesKoşullu Ekleme: putIfAbsentMap'ten Öge Kaldırmaİç İçe Map'lerÖzet - Envanter Güncelleme7İleri Seviye Fonksiyonlar
Anonim FonksiyonlarFonksiyonları Argüman Olarak AktarmaClosure'ları AnlamakÖzyinelemeye GirişÖzyinelemeli Fonksiyon: Geri SayımÖzyinelemeli Fonksiyon: FaktöriyelÖzet - Liste İşleyici10Son Meydan Okumalar
Meydan Okuma: Not SıralayıcıMeydan Okuma: Sesli Harf SayacıMeydan Okuma: FizzBuzz2Fonksiyonel Liste İşlemleri
'map' ile Dönüştürme'where' ile Filtreleme'.toList()' Kullanımı'any' ile Koşul Kontrolü'every' ile Koşullar'firstWhere' ile BulmaÖzet - Veri Filtreleme5Proje: Alışveriş Sepeti Hesaplayıcı
Proje KurulumuSepete Ürün Ekleme3Kümeler
Küme Nedir?Küme OluşturmaKümelere Eleman Ekleme ve ÇıkarmaKüme İçinde Eleman KontrolüListeyi Kümeye DönüştürmeKüme BirleşimiKüme KesişimiKüme FarkıÖzet - Benzersiz Davetli ListesiKendi başına pratik yap: Online Dart derleyicisi