__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ı: 100Bu ö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ı: 0Bir tablo sabit yedek değerler sağlar; bir fonksiyon ise eksik olan herhangi bir anahtar için bir değer hesaplayabilir.
Görev
Kolayname 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) velevel(sağlanan seviye) - Varsayılanlar tablosunu işaret eden
__indexiç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
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 TablosuKendi başına pratik yap: Online Lua derleyicisi