__index Metametodu
Coddy'nin Lua Journey'sinin Mantık ve Akış 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 metametot hakkında bilgi edinme 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 varsa, Lua bunun yerine o alanı kontrol edecektir. 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 tablosunu 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 isim 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 metatable 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 isim) velevel(sağlanan seviye) __indexözelliği varsayılanlar tablosuna işaret eden bir metatable oluşturunsetmetatable()kullanarak metatable'ı karakter tablosuna ekleyin- Karakter tablosunu döndürün
Parametreler:
name(string): Karakterin ismilevel(number): Karakterin seviyesi
Döndürdüğü Değer: Metatable aracılığıyla erişilebilen isim, seviye ve varsayılan istatistikleri içeren bir karakter tablosu (table)
Kendin dene
function createCharacterWithDefaults(name, level)
-- Kodunuzu buraya yazın
end
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
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