0Pricing
Lua Academy · Ders

Ü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_1

setmetatable 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 metatable

Tablo 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))   -- Lua

rawget 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) -- 20

Bir 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, {}) -- ERROR

Metatable 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)                           -- 5

Tablo 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-hello

Metatable'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önderim
  • rawget/rawset metamethod'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

  1. Üst Tablolara Giriş
  2. __index ve __newindex
  3. Aritmetik Üst Yöntemleri
  4. __tostring ve __len
← Lua Academy Sayfasına Dön