Üst Tablolara Giriş
setmetatable/getmetatable ile üst tabloları ayarlayın ve alın.
Üst Tablolara Giriş, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.
Metatable Nedir?
metatable, başka bir tablonun davranışını denetleyen normal bir Lua tablosudur. Lua, bir tablo üzerinde gerçekleştiremediği bir işlemle (aritmetik işlem veya eksik bir anahtarı dizinleme gibi) karşılaştığında, metatable içinde karşılık gelen bir meta yöntemi arar. Bu, Lua'nın işleç aşırı yüklemesi ve nesne yönelimli programlama için genişletme mekanizmasıdır.
local t = {}
local mt = {__index = function(_, k) return "default_" .. k end}
setmetatable(t, mt)
print(t.foo) -- default_foo
print(t.bar) -- default_bar
print(t[1]) -- default_1setmetatable ve getmetatable
setmetatable(t, mt), t tablosunun metatable'ını mt olarak ayarlar ve t döndürür. getmetatable(t), metatable'ı, yoksa nil döndürür. mt.__metatable = "protected" ayarını yaparak metatable'ın değiştirilmesini engelleyebilirsiniz.
local t = {x = 10}
local mt = {}
setmetatable(t, mt)
print(getmetatable(t) == mt) -- true
-- Protect metatable
mt.__metatable = "locked"
print(getmetatable(t)) -- locked
-- setmetatable(t, {}) -- ERROR: cannot change protected metatableTablo olarak __index
__index bir tablo olduğunda Lua, eksik anahtarı bu tabloda arar. Bu, Lua'daki prototip kalıtımının temelidir. Anahtar __index içinde de yoksa Lua, zincirde yukarı doğru ilerleyerek onun metatable'ını ve devamını denetler.
local Animal = {sound = "...", legs = 4}
local Dog = setmetatable({sound = "Woof"}, {__index = Animal})
local Cat = setmetatable({sound = "Meow"}, {__index = Animal})
print(Dog.sound) -- Woof (own field)
print(Dog.legs) -- 4 (from Animal)
print(Cat.sound) -- Meow
print(Cat.legs) -- 4İşlev olarak __index
__index bir işlev olduğunda Lua, bu işlevi tablo ve eksik anahtarla çağırır. İşlev, değeri dinamik olarak hesaplayabilir veya getirebilir. "Anahtar bulunamadı" durumunu belirtmek için __index içinden nil döndürün.
local dynamic = setmetatable({}, {
__index = function(t, k)
if k:sub(1,4) == "get_" then
local field = k:sub(5)
return function(self) return self[field] end
end
return nil
end
})
dynamic.name = "Lua"
local getter = dynamic.get_name
print(getter(dynamic)) -- Luarawget ve rawset
rawget(t, k), __index tetiklemeden bir tablo anahtarını okur. rawset(t, k, v), __newindex tetiklemeden bir anahtar ayarlar. Sonsuz özyinelemeyi önlemek amacıyla bir meta yöntemi içinde doğrudan tablo erişimine ihtiyaç duyduğunuzda, meta yöntemlerini atlamak için bunları kullanın.
local logged = setmetatable({}, {
__newindex = function(t, k, v)
print("Setting", k, "=", v)
rawset(t, k, v) -- bypass __newindex
end
})
logged.x = 10 -- Setting x = 10
logged.x = 20 -- no log! key now exists in t
print(logged.x) -- 20Bir Metatable'ı Paylaşan Birden Çok Tablo
Tek bir metatable birçok tablo tarafından paylaşılabilir. Lua sınıf sistemleri böyle çalışır: Bir sınıfın tüm örnekleri, yöntemleri barındıran aynı metatable'ı paylaşır. Metatable'da yapılan değişiklikler tüm örnekleri etkiler.
local Mt = {
__index = {
greet = function(self)
print("Hello from " .. (self.name or "?"))
end
}
}
local a = setmetatable({name="Alice"}, Mt)
local b = setmetatable({name="Bob"}, Mt)
a:greet() -- Hello from Alice
b:greet() -- Hello from Bob__metatable Alanı
mt.__metatable alanını herhangi bir değere ayarlamak, getmetatable işlevinin gerçek metatable yerine bu değeri döndürmesine neden olur. Bu, kullanıcıların metatable'ı incelemesini veya değiştirmesini önler; kapsülleme ve güvenlik için kullanışlıdır.
local secret = setmetatable({}, {
__metatable = false, -- hide metatable
__index = {value = 42}
})
print(secret.value) -- 42
print(getmetatable(secret)) -- false (not the real mt)
-- setmetatable(secret, {}) -- ERRORMetatable Denetleme
Bir nesnenin belirli bir metatable'a sahip olup olmadığını denetlemek (tür denetimi yapmak) için getmetatable(t) kullanın. __metatable gerçek metatable'ı gizleyebileceğinden, güvenilir isinstance denetimleri için rawequal veya bir işaretleyici alan kullanın.
local MyClass = {}
MyClass.__index = MyClass
MyClass.__metatable = MyClass -- use self as marker
function MyClass.new(x)
return setmetatable({x=x}, MyClass)
end
local obj = MyClass.new(5)
print(getmetatable(obj) == MyClass) -- true
print(obj.x) -- 5Tablo Olmayan Türlerde Metatable'lar
Lua'daki dizgelerin zaten bir metatable'ı vardır (string modülü). Bu nedenle herhangi bir dizge üzerinde s:upper() çağırabilirsiniz. Saf Lua'da dizgeler, sayılar veya boolean'lar üzerinde metatable ayarlayamazsınız; yalnızca tablolar ve userdata üzerinde ayarlayabilirsiniz.
local s = "hello"
local mt = getmetatable(s)
-- String metatable has __index = string library
print(mt.__index == string) -- true
-- So all string functions are methods:
print(s:upper()) -- HELLO
print(s:rep(3, "-")) -- hello-hello-helloMetatable'larla Hata Ayıklama
Bir tablonun tostring() ve print() tarafından nasıl görüntüleneceğini denetlemek için bir __tostring metamethod'u ekleyebilirsiniz. Bu, karmaşık nesnelerde hata ayıklamak için son derece değerlidir.
local Point = {}
Point.__index = Point
Point.__tostring = function(p)
return string.format("Point(%g, %g)", p.x, p.y)
end
function Point.new(x, y)
return setmetatable({x=x,y=y}, Point)
end
local p = Point.new(3, 4)
print(tostring(p)) -- Point(3, 4)
print(p) -- Point(3, 4) (print calls tostring)Hızlı Denetim
__index alanı başka bir tabloya ayarlanmış bir metatable'a sahip tabloda bulunmayan bir anahtara eriştiğinizde ne olur?
Özet: Metatable'lar
Özet:
setmetatable(t, mt)/getmetatable(t)__index: tablo → prototip araması; işlev → dinamik gönderimrawget/rawsetmetamethod'ları devre dışı bırakır- Paylaşılan metatable'lar sınıfa benzer davranış sağlar
__metatable, metatable'ı incelemeye karşı korur__tostring, yazdırılan çıktıyı denetler
Sıkça Sorulan Sorular
“Üst Tablolara Giriş” dersi ücretsiz mi?
Evet — “Üst Tablolara Giriş” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.
“Üst Tablolara Giriş” dersinde ne öğreneceğim?
setmetatable/getmetatable ile üst tabloları ayarlayın ve alın. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Lua Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“Üst Tablolara Giriş” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Üst Tablolara Giriş
- __index ve __newindex
- Aritmetik Üst Yöntemleri
- __tostring ve __len