Menu
CoddyTech

__index Metametodu

Coddy'nin Lua Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 18 / 54.

Tablolara metatablo eklemeyi öğrendiğine göre, şimdi en önemli metamethod'u öğrenme zamanı: __index. Bu metamethod, bir tabloda bulunmayan bir anahtara erişmeye çalıştığında ne olacağını belirler.

Normalde, bir tabloda bulunmayan bir anahtarı aradığında Lua nil döndürür. Ancak bir tablonun __index alanına sahip bir metatablosu varsa Lua bunun yerine o alanı kontrol eder. __index başka bir tabloyu gösteriyorsa Lua anahtarı orada arar:

local defaults = {
    health = 100,
    speed = 10
}

local player = {name = "Alice"}
local meta = {__index = defaults}

setmetatable(player, meta)

print(player.name)    -- Çıktı: Alice
print(player.health)  -- Çıktı: 100

Bu örnekte player yalnızca bir name anahtarına sahiptir. player.health öğesine eriştiğinde Lua bunu player içinde bulamaz, bu yüzden metatablonun __index alanını kontrol eder. __index, defaults tablosunu gösterdiği için Lua oraya bakar ve health = 100 değerini bulur.

Bu, bir tablonun başka bir tablo için varsayılan değerler sağlayabildiği bir yedek mekanizması oluşturur. Orijinal tablo kendi değerlerini korur, ancak eksik anahtarlar otomatik olarak yedek tabloda aranır.

__index bir fonksiyon da olabilir. Bir anahtar eksik olduğunda Lua, tabloyu ve anahtarı ona geçirerek çağırır ve döndürdüğü değeri kullanır:

local scores = {alice = 12}

setmetatable(scores, {
    __index = function(t, key)
        return 0  -- eksik olan her isim 0 olarak sayılır
    end
})

print(scores.alice)  -- Çıktı: 12
print(scores.bob)    -- Çıktı: 0

Bir tablo sabit yedek değerler sağlar; bir fonksiyon ise eksik olan herhangi bir anahtar için bir değer hesaplayabilir.

challenge icon

Görev

Kolay

name ve level alan ve varsayılan özellik değerlerine sahip bir karakter tablosu döndüren createCharacterWithDefaults adlı bir işlev yazın.

Sağlanan ad ve seviyeyi içeren bir karakter tablosu oluşturun. Eksik özellikler (health, mana, strength) için varsayılan değerler sağlamak üzere __index kullanan bir metatablo kullanın.

Mantık:

  • Şu anahtarlara sahip bir varsayılanlar tablosu oluşturun: health = 100, mana = 50, strength = 10
  • Şu anahtarlara sahip bir karakter tablosu oluşturun: name (sağlanan ad) ve level (sağlanan seviye)
  • Varsayılanlar tablosunu işaret eden __index içeren bir metatablo oluşturun
  • setmetatable() kullanarak metatabloyu karakter tablosuna bağlayın
  • Karakter tablosunu döndürün

Parametreler:

  • name (string): Karakterin adı
  • level (number): Karakterin seviyesi

Döndürür: Adı, seviyesi ve metatablo aracılığıyla erişilebilen varsayılan özellikleri olan bir karakter tablosu (table)

Kendin dene

function createCharacterWithDefaults(name, level)
    -- Kodu buraya yazın
end
quiz iconKendini test et

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

Kendi başına pratik yap: Online Lua derleyicisi