setmetatable & getmetatable
Coddy'nin Lua Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 17 / 54.
Artık metatabloların kavramsal olarak ne olduğunu anladığına göre, onlarla pratikte nasıl çalışacağını öğrenmenin zamanı geldi. Lua bunun için iki temel işlev sağlar: bir tabloya metatablo eklemek için setmetatable() ve metatablı almak için getmetatable().
Bir tabloya bir metatablo eklemek için setmetatable() kullanırsın. Bu işlev iki bağımsız değişken alır: değiştirmek istediğin tablo (ana tablo) ve ona eklemek istediğin metatablo:
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 alan ve metatablosu başarıyla eklenirse true döndüren attachMetatable adlı bir işlev yazın.
Metatablosunu ana tabloya eklemek için setmetatable() kullanın, ardından eklemeyi getmetatable() kullanarak doğrulayın.
Mantık:
setmetatable()kullanarakmetaTableöğesinimainTableöğesine ekleyingetmetatable()kullanarak eklenen metatablosunu alın- Alınan metatablosunu özgün
metaTableile karşılaştırın - Eşleşiyorlarsa
true, aksi takdirdefalsedöndürün
Parametreler:
mainTable(table): Metatablosunun ekleneceği tablometaTable(table): Eklenecek metatablosu
Döndürür: Metatablosu başarıyla eklenip doğrulanırsa true, aksi takdirde false (boolean)
Kendin 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.
Mantık ve Akış 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 TablosuKendi başına pratik yap: Online Lua derleyicisi