Menu
Coddy logo textTech

__index Metametodu

Coddy'nin Lua Journey'sinin Logic & Flow bölümünün bir parçası — ders 18 / 54.

Artık metatabloları tablolara nasıl ekleyeceğinizi bildiğinize göre, en önemli metametodu öğrenmenin zamanı geldi: __index. Bu metametot, bir tabloda var olmayan bir anahtara erişmeye çalıştığınızda ne olacağını kontrol eder.

Normalde, bir tabloda bulunmayan bir anahtara baktığınızda Lua nil döndürür. Ancak bir tablonun __index alanına sahip bir metatablosu olduğunda, Lua bunun yerine o alanı kontrol eder. Eğer __index başka bir tabloyu işaret ediyorsa, Lua anahtarı orada arayacaktır:

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 sadece bir name anahtarına sahiptir. player.health değerine eriştiğinizde, Lua bunu player içinde bulamaz, bu yüzden metatablo'nun __index alanını kontrol eder. __index, defaults tablosuna işaret ettiği için Lua oraya bakar ve health = 100 değerini bulur.

Bu, bir tablonun diğeri için varsayılan değerler sağlayabildiği bir yedekleme (fallback) mekanizması oluşturur. Orijinal tablo kendi değerlerini korur, ancak eksik olan tüm anahtarlar otomatik olarak yedekleme tablosunda aranır.

challenge icon

Görev

Kolay

name ve level parametrelerini alan ve varsayılan istatistik değerlerine sahip bir karakter tablosu döndüren bir createCharacterWithDefaults fonksiyonu yazın.

Sağlanan ad ve seviye ile bir karakter tablosu oluşturun. Eksik olan herhangi bir istatistik (health, mana, strength) için varsayılan değerleri sağlamak üzere __index içeren bir metatablo kullanın.

Mantık:

  • Şu anahtarlara sahip bir varsayılanlar (defaults) 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)
  • __index özelliği varsayılanlar tablosuna işaret eden bir metatablo oluşturun
  • setmetatable() kullanarak metatabloyu karakter tablosuna ekleyin
  • Karakter tablosunu döndürün

Parametreler:

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

Döndürür: Metatablo aracılığıyla erişilebilen ad, seviye ve varsayılan istatistikleri içeren bir karakter tablosu (table)

Kopya kağıdı

__index metametodu, bir tabloda var olmayan bir anahtara erişmeye çalıştığınızda ne olacağını kontrol eder.

Bir tablonun başka bir tabloyu işaret eden __index alanına sahip bir metatablosu olduğunda, Lua eksik anahtarları o tabloda arayacaktır:

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, bir tablonun diğeri için varsayılan değerler sağlayabildiği bir geri dönüş (fallback) mekanizması oluşturur. Orijinal tablo kendi değerlerini korur, ancak eksik olan tüm anahtarlar otomatik olarak geri dönüş tablosunda aranır.

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.

Logic & Flow bölümündeki tüm dersler