__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ı: 100Bu ö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.
Görev
Kolayname 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) velevel(sağlanan seviye) __indexözelliği varsayılanlar tablosuna işaret eden bir metatablo oluşturunsetmetatable()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ı: 100Bu, 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
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
1İleri Düzey Tablo Yineleme
pairs() ile Yinelemeipairs() ile Yinelemepairs() vs. ipairs()Özet - Karakter Sayfası2Daha Fazla Tablo Kütüphanesi Fonksiyonu
table.concat()Tablo Oluşturma ve unpack()table.sort()Fonksiyonlar ile Özel SıralamaÖzet - Yüksek Skor Tablosu