Pola Iterator
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 64 dari 70.
Ketika kamu memiliki kumpulan item yang disimpan di dalam object, kamu sering ingin melakukan perulangan untuk mengaksesnya. for loop generik Lua bekerja dengan sangat baik menggunakan iterator kustom, dan kamu dapat membuat fungsi ini langsung di dalam class-mu.
Pola Iterator memungkinkan sebuah object mengendalikan cara data internalnya ditelusuri. Salah satu pendekatan yang elegan menggunakan metamethod __call, yang membuat object dapat dipanggil seperti fungsi. Setiap pemanggilan mengembalikan item berikutnya sampai tidak ada lagi.
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
Setelah __call didefinisikan, kamu bisa melakukan iterasi menggunakan perulangan while atau langsung meneruskan object ke for generik:
local bag = Collection:new()
bag:add("apple")
bag:add("banana")
for item in bag do
print(item)
end
Perulangan memanggil bag() berulang kali. Saat __call mengembalikan nil (tidak ada item lagi), perulangan berhenti. Pola ini merangkum logika iterasi di dalam object itu sendiri, sehingga kamu memiliki kendali penuh atas cara dan urutan item diakses.
Tantangan
MudahMari kita membuat class Playlist yang bisa kamu iterasi menggunakan for generik Lua! Kamu akan menerapkan pola Iterator menggunakan metamethod __call, sehingga playlist-mu bisa ditelusuri lagu demi lagu.
Kamu akan mengatur kodemu dalam dua file:
Playlist.lua: Buat class Playlist yang menyimpan lagu secara internal. Class-mu memerlukan konstruktor:new()yang menginisialisasi list lagu kosong dan menetapkan indeks iterasi ke 0. Tambahkan method:addSong(title)untuk menambahkan lagu ke playlist. Yang terpenting, implementasikan metamethod__callagar setiap kali playlist "dipanggil", playlist mengembalikan lagu berikutnya dalam list (atauniljika tidak ada lagu lagi).main.lua: Gunakan require untuk module Playlist-mu dan buat playlist baru. Tambahkan lagu ke dalamnya berdasarkan input yang kamu terima, lalu gunakan perulanganforgenerik untuk mengiterasi playlist dan mencetak setiap judul lagu pada barisnya sendiri.
Keistimewaan pola Iterator adalah object Playlist-mu menjadi bisa dipanggil. Saat digunakan dalam perulangan for, Lua memanggilnya berulang kali hingga mengembalikan nil, sehingga kamu mendapatkan setiap lagu secara berurutan.
Kamu akan menerima tiga input, masing-masing mewakili judul lagu yang akan ditambahkan ke playlist-mu (secara berurutan).
Contohnya, jika inputnya adalah Bohemian Rhapsody, Stairway to Heaven, dan Hotel California, output-nya seharusnya:
Bohemian Rhapsody
Stairway to Heaven
Hotel CaliforniaJika inputnya adalah Yesterday, Imagine, dan Let It Be, output-nya seharusnya:
Yesterday
Imagine
Let It BeCoba sendiri
-- Muat module Playlist dengan require
local Playlist = require('Playlist')
-- Baca tiga judul lagu dari input
local song1 = io.read()
local song2 = io.read()
local song3 = io.read()
-- TODO: Buat playlist baru menggunakan Playlist:new()
-- TODO: Tambahkan tiga lagu ke playlist menggunakan :addSong()
-- TODO: Gunakan generic for loop untuk menelusuri playlist
-- dan cetak setiap judul lagu pada baris tersendiri
-- Petunjuk: for song in playlist do ... end
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Konsep "Self"
Tabel dengan Fungsi'self' EksplisitSintaks Titik DuaTitik vs Titik DuaRangkuman, Titik Bergerak4Proyek: Bank Digital
Penyiapan Proyekmethod Setoran7Polimorfisme & Overriding
Menimpa methodMemanggil method indukDuck TypingAntarmuka UmumMemeriksa TipeRingkasan: Peran Karyawan10Proyek: Pengelola Bentuk
Penyiapan Proyekclass Rectangleclass Circlemethod KelilingKumpulan BentukLuas TotalSaring Bentuk2Pola Prototype untuk class
Konsep PrototypeMenghubungkan dengan __indexKonstruktor :new()Menginisialisasi AtributInstans yang MandiriRangkuman: Pabrik Mobil5Pembebanan Operator dalam OOP
Menjumlahkan ObjekMengurangkan ObjekMenggabungkan ObjekMembandingkan Objek (<, >)Ulasan: Aritmetika Dompet8Enkapsulasi
Konvensi PenamaanClosure untuk PrivasiAkses melalui ClosureTabel Hanya-BacaLogika ValidasiRangkuman: Brankas Aman11Pola Desain (Ringan)
Fungsi FactoryTabel SingletonPola IteratorObserver (Listener)Rangkuman, Factory Logger3State dan Behavior pada object
Variabel InstansGetter methodSetter methodProperty TerhitungMemformat stringPemeriksaan KesetaraanRangkuman: Nilai Siswa6Dasar-Dasar Pewarisan
Menyiapkan PewarisanMewarisi methodMemperluas KonstruktorMenambahkan method untuk ChildSama vs UnikRangkuman: Hierarki BentukLatihan sendiri: Compiler Lua online