setmetatable & getmetatable
Coddy'nin Lua Journey'sinin Logic & Flow bölümünün bir parçası — ders 17 / 54.
Metatabloların kavramsal olarak ne olduğunu anladığınıza göre, onlarla gerçekte nasıl çalışacağınızı öğrenmenin zamanı geldi. Lua bunun için iki temel fonksiyon sağlar: bir tabloya metatable eklemek için setmetatable() ve onu almak için getmetatable().
Bir tabloya metatable eklemek için setmetatable() kullanırsınız. Bu fonksiyon iki argüman alır: değiştirmek istediğiniz tablo (ana tablo) ve ona eklemek istediğiniz metatable:
local myTable = {name = "Alice"}
local myMetatable = {}
setmetatable(myTable, myMetatable)Bu örnekte, myMetatable artık myTable tablosuna bağlıdır. Metatablo şu an için boştur, ancak bu iki tablo arasındaki bağlantıyı kurar. setmetatable() fonksiyonu ayrıca ana tabloyu döndürür, bu da gerekirse işlemi zincirlemenize olanak tanır.
Bir tabloya eklenmiş metatabloyu almak için getmetatable() kullanırsınız:
local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable) -- Çıktı: trueBu fonksiyon, eğer bir tane eklenmişse metatabloyu, tablo bir metatabloya sahip değilse nil döndürür. Bu, bir tablonun metatablosu ayarlandıktan sonra onu kontrol etmeniz veya değiştirmeniz gerektiğinde yararlıdır.
Bu iki fonksiyonu anlamak, Lua'daki tüm metatablo çalışmalarının temelidir. Metatabloları ekleyip alabildiğinizde, tablolarınızın nasıl davranacağını değiştiren metayöntemleri (metamethods) tanımlamaya hazır olacaksınız.
Görev
KolaymainTable ve metaTable parametrelerini alan ve metatablo başarıyla eklendiyse true döndüren bir attachMetatable fonksiyonu yazın.
Metatabloyu ana tabloya eklemek için setmetatable() kullanın, ardından getmetatable() kullanarak ekleme işlemini doğrulayın.
Mantık:
setmetatable()kullanarakmetaTable'ımainTable'a ekleyingetmetatable()kullanarak eklenen metatabloyu alın- Alınan metatabloyu orijinal
metaTableile karşılaştırın - Eşleşiyorlarsa
true, aksi takdirdefalsedöndürün
Parametreler:
mainTable(table): Metatablonun ekleneceği tablometaTable(table): Eklenecek metatablo
Döndürür: Metatablo başarıyla eklendiyse ve doğrulandıysa true, aksi takdirde false (boolean)
Kopya kağıdı
Lua, metatablolarla çalışmak için iki temel fonksiyon sağlar:
setmetatable() - Bir tabloya bir metatable ekler. İki argüman alır: ana tablo ve eklenecek metatable. Ana tabloyu döndürür.
local myTable = {name = "Alice"}
local myMetatable = {}
setmetatable(myTable, myMetatable)getmetatable() - Bir tabloya eklenmiş olan metatable'ı alır. Eğer bir metatable ekliyse onu döndürür, tabloya ait bir metatable yoksa nil döndürür.
local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable) -- Çıktı: trueKendin dene
function attachMetatable(mainTable, metaTable)
-- Kodunuzu buraya yazın
end
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Logic & Flow bölümündeki tüm dersler
1İleri Düzey Tablo Yineleme
pairs() ile Yinelemeipairs() ile Yinelemepairs() vs. ipairs()Özet - Karakter Sayfası4Metatable'lara Giriş
Metatable Nedir?setmetatable & getmetatable__index Metametodu__newindex Metametodu__tostring MetametoduAritmetik Metametotlar Bölüm 1Aritmetik Metametotlar Bölüm 2Özet - Salt Okunur Tablo2Daha Fazla Tablo Kütüphanesi Fonksiyonu
table.concat()Tablo Oluşturma ve unpack()table.sort()Fonksiyonlar ile Özel SıralamaÖzet - Yüksek Skor Tablosu