Iterator Kalıbı
Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 64 / 70.
Bir nesnenin içinde depolanan öğelerden oluşan bir koleksiyonunuz olduğunda, genellikle bunlar üzerinde döngü oluşturmak istersiniz. Lua'nın genel for döngüsü özel yineleyicilerle harika bir şekilde çalışır ve bu işlevselliği doğrudan sınıflarınıza ekleyebilirsiniz.
Iterator deseni, bir nesnenin dahili verileri arasında nasıl gezinileceğini kontrol etmesini sağlar. Zarif bir yaklaşım, bir nesneyi fonksiyon gibi çağrılabilir hâle getiren __call metamethod'unu kullanır. Her çağrı, başka öğe kalmayana kadar bir sonraki öğeyi döndürür.
local Collection = {}
Collection.__index = Collection
function Collection:new()
local obj = { items = {}, index = 0 }
setmetatable(obj, Collection)
return obj
end
function Collection:add(item)
table.insert(self.items, item)
end
function Collection:__call()
self.index = self.index + 1
return self.items[self.index]
end
__call tanımlandığında, bir while döngüsü kullanarak yineleme yapabilir veya nesneyi doğrudan genel bir for döngüsüne aktarabilirsin:
local bag = Collection:new()
bag:add("apple")
bag:add("banana")
for item in bag do
print(item)
end
Döngü bag() işlevini tekrar tekrar çağırır. __call nil döndürdüğünde (artık öğe kalmadığında) döngü durur. Bu desen, yineleme mantığını nesnenin kendisi içinde kapsüller ve öğelere nasıl ve hangi sırayla erişileceği üzerinde tam denetim sağlar.
Görev
KolayLua'nın genel for döngüsünü kullanarak üzerinde yineleme yapabileceğin bir Playlist sınıfı oluşturalım! __call metamethod'unu kullanarak Iterator kalıbını uygulayacak ve çalma listenin şarkı şarkı üzerinden geçilmesini sağlayacaksın.
Kodunu iki dosyaya ayıracaksın:
Playlist.lua: Şarkıları dahili olarak depolayan bir Playlist sınıfı oluştur. Sınıfının boş bir şarkı listesi başlatan ve yineleme indeksini 0 olarak ayarlayan bir:new()kurucusuna ihtiyacı var. Çalma listesine şarkı eklemek için bir:addSong(title)metodu ekle. En önemlisi, çalma listesi her "çağrıldığında" listedeki bir sonraki şarkıyı (veya başka şarkı kalmadığında__call) döndürecek şekildenilmetamethod'unu uygula.main.lua: Playlist modülünü içe aktar ve yeni bir çalma listesi oluştur. Aldığın girdilere göre çalma listesine şarkılar ekle, ardından çalma listesi üzerinde yineleme yapmak ve her şarkı başlığını kendi satırına yazdırmak için genel birfordöngüsü kullan.
Iterator kalıbının sihri, Playlist nesnenin bir for döngüsünde kullanıldığında çağrılabilir hâle gelmesidir. Lua, nil döndürene kadar onu tekrar tekrar çağırarak sana her şarkıyı sırayla verir.
Her biri çalma listene eklenecek bir şarkı başlığını temsil eden üç girdi alacaksın (sırayla).
Örneğin girdiler Bohemian Rhapsody, Stairway to Heaven ve Hotel California ise çıktı şöyle olmalıdır:
Bohemian Rhapsody
Stairway to Heaven
Hotel CaliforniaGirdiler Yesterday, Imagine ve Let It Be ise çıktı şöyle olmalıdır:
Yesterday
Imagine
Let It BeKendin dene
-- Playlist modülünü yükle
local Playlist = require('Playlist')
-- Girdiden üç şarkı başlığı oku
local song1 = io.read()
local song2 = io.read()
local song3 = io.read()
-- TODO: Playlist:new() kullanarak yeni bir çalma listesi oluştur
-- TODO: :addSong() kullanarak üç şarkıyı çalma listesine ekle
-- TODO: Çalma listesinde dolaşmak için genel bir for döngüsü kullan
-- ve her şarkı başlığını kendi satırına yazdır
-- İpucu: for song in playlist do ... end
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1'Self' Kavramı
Fonksiyonlu TablolarAçık 'self'İki Nokta SözdizimiNokta vs İki NoktaÖzet - Hareket Eden Nokta4Proje: Dijital Banka
Proje KurulumuPara Yatırma Metodu7Çok Biçimlilik ve Geçersiz Kılma
Metotları Geçersiz KılmaÜst Sınıf Metotlarını ÇağırmaDuck TypingOrtak ArayüzTür KontrolüÖzet - Çalışan Rolleri2Sınıf Prototip Kalıbı
Prototip Kavramı__index ile Bağlama:new() KurucusuÖznitelikleri BaşlatmaBağımsız ÖrneklerÖzet - Araba Fabrikası5OOP'de Operatör Aşırı Yükleme
Nesneleri ToplamaNesneleri ÇıkarmaNesneleri BirleştirmeNesneleri Karşılaştırma (<, >)Özet - Cüzdan Matematiği8Kapsülleme
Adlandırma KurallarıGizlilik için Closure'larClosure'lar Aracılığıyla ErişimSalt Okunur TablolarDoğrulama MantığıÖzet - Güvenli Kasa11Tasarım Kalıpları (Lite)
Fabrika FonksiyonlarıSingleton TablosuIterator KalıbıObserver (Dinleyici)Özet - Logger Fabrikası3Nesne Durumu ve Davranışı
Örnek DeğişkenleriGetter MetotlarıSetter MetotlarıHesaplanmış ÖzelliklerString BiçimlendirmeEşitlik KontrolleriÖzet - Öğrenci Notu6Kalıtımın Temelleri
Kalıtım KurulumuMetot KalıtımıConstructor'ı GenişletmeAlt Sınıf Metotları EklemePaylaşılan ve BenzersizÖzet - Şekil HiyerarşisiKendi başına pratik yap: Online Lua derleyicisi