__index ile Bağlama
Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 7 / 70.
Özellikleri ve metotları olan bir prototip tablonuz var, ancak yeni bir nesnenin bunu gerçekten kullanmasını nasıl sağlarsınız? Cevap __index metametodunda yatmaktadır.
Bir tabloda var olmayan bir anahtara eriştiğinizde, Lua normalde nil döndürür. Ancak, tablonun __index alanına sahip bir metatablosu varsa, Lua bunun yerine oraya bakacaktır. __index alanını prototipinize işaret edecek şekilde ayarlayarak, eksik olan tüm anahtarlar otomatik olarak prototipte bulunur:
local Dog = {
species = "Canis familiaris",
legs = 4
}
function Dog:bark()
print("Woof!")
end
-- Boş bir örnek oluşturun
local myDog = {}
-- Onu prototipe bağlayın
setmetatable(myDog, { __index = Dog })
print(myDog.species) -- Çıktı: Canis familiaris
myDog:bark() -- Çıktı: Woof!myDog tablosu tamamen boştur, ancak myDog.species erişimi çalışır. Lua, myDog içinde species bulamadığında, metatablo'nun __index kısmını kontrol eder ve onu Dog içinde bulur.
Bu, Lua’da nesne yönelimli programlamanın temelidir. Örnek kendi benzersiz verilerine sahip olabilirken paylaşılan davranış prototipte bulunur. Bir sonraki derste, bu kalıbı temiz bir kurucu işlevinde nasıl kapsülleyeceğini öğreneceksin.
Görev
KolayŞimdi __index metamethod'unu uygulamaya koyalım! Bir prototip oluşturacak ve bir örneği ona bağlayacaksın; böylece örnek, doğrudan sahip olmadığı özelliklere ve metotlara erişebilecek.
Kodunu iki dosyaya ayıracaksın:
Robot.lua: Şunları içeren birRobotprototip tablosu tanımla:modelalanını"RX-100"olarak ayarlabatteryLevelalanını100olarak ayarla- Robotun mevcut durumunu yazdıran bir
:status()metodu ekle
main.lua: Robot modülünü gerektir, ardından bir boş örnek tablosu oluştur vesetmetatableile birlikte__indexkullanarak onu Robot prototipine bağla. Bu, boş örneğinin prototipteki her şeye erişmesini sağlar.
Tek bir girdi alacaksın: robot örneğine atanacak bir ad.
Örneği prototipe bağladıktan sonra:
- Girdi olarak alınan adı örneğinin
namealanına ata (bu alan örneğe özgü olur) - Örneğin üzerinde
:status()metodunu çağır
:status() metodun tam olarak şu biçimde yazdırmalıdır:
[name] ([model]) - Battery: [batteryLevel]%Örneğin, girdi Sparky ise çıktı şöyle olmalıdır:
Sparky (RX-100) - Battery: 100%Örneğin kendine ait bir name alanı olduğunu, ancak model bağlantısı aracılığıyla batteryLevel ve __index alanlarına prototipten eriştiğini fark et.
Kendin dene
-- Girdiyi oku
local name = io.read()
-- Robot modülünü dahil et
local Robot = require('Robot')
-- YAPILACAK: Boş bir örnek (instance) tablosu oluşturun
-- YAPILACAK: __index ile setmetatable kullanarak örneği Robot prototipine bağlayın
-- YAPILACAK: Girdi ismini örneğinizin name alanına atayın
-- YAPILACAK: Örneğiniz üzerinde :status() metodunu çağırın
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