Il metametodo __index
Fa parte della sezione Logica e flusso del percorso Lua di Coddy. Lezione 18 di 54.
Ora che sai come associare le metatabelle alle tabelle, è il momento di imparare il metametodo più importante: __index. Questo metametodo controlla cosa succede quando provi ad accedere a una chiave che non esiste in una tabella.
Normalmente, quando cerchi una chiave che non si trova in una tabella, Lua restituisce nil. Ma quando una tabella ha una metatabella con un campo __index, Lua controllerà invece quel campo. Se __index punta a un'altra tabella, Lua cercherà lì la chiave:
local defaults = {
health = 100,
speed = 10
}
local player = {name = "Alice"}
local meta = {__index = defaults}
setmetatable(player, meta)
print(player.name) -- Output: Alice
print(player.health) -- Output: 100In questo esempio, player ha solo una chiave name. Quando accedi a player.health, Lua non la trova in player, quindi controlla il campo __index della metatable. Poiché __index punta alla tabella defaults, Lua cerca lì e trova health = 100.
Questo crea un meccanismo di ripiego in cui una tabella può fornire valori predefiniti per un'altra. La tabella originale conserva i propri valori, ma tutte le chiavi mancanti vengono cercate automaticamente nella tabella di ripiego.
__index può anche essere una funzione. Quando manca una chiave, Lua la chiama passando la tabella e la chiave, e usa il valore restituito:
local scores = {alice = 12}
setmetatable(scores, {
__index = function(t, key)
return 0 -- ogni nome mancante vale 0
end
})
print(scores.alice) -- Output: 12
print(scores.bob) -- Output: 0Una tabella fornisce valori di ripiego fissi; una funzione può calcolare un valore per qualsiasi chiave mancante.
Sfida
FacileScrivi una funzione createCharacterWithDefaults che accetta name e level e restituisce una tabella del personaggio con valori predefiniti per le statistiche.
Crea una tabella del personaggio con il nome e il livello forniti. Usa una metatabella con __index per fornire valori predefiniti per tutte le statistiche mancanti (health, mana, strength).
Logica:
- Crea una tabella defaults con le chiavi:
health = 100,mana = 50,strength = 10 - Crea una tabella del personaggio con le chiavi:
name(il nome fornito) elevel(il livello fornito) - Crea una metatabella con
__indexche punta alla tabella defaults - Associa la metatabella alla tabella del personaggio usando
setmetatable() - Restituisci la tabella del personaggio
Parametri:
name(stringa): Il nome del personaggiolevel(numero): Il livello del personaggio
Valore restituito: Una tabella del personaggio con nome, livello e statistiche predefinite accessibili tramite la metatabella (tabella)
Provalo tu
function createCharacterWithDefaults(name, level)
-- Scrivi il codice qui
end
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Iterazione avanzata delle tabelle
Iterare con pairs()Iterare con ipairs()pairs() vs. ipairs()Riepilogo - Scheda del personaggio4Introduzione alle metatabelle
Che cos’è una metatabella?setmetatable e getmetatableIl metametodo __indexIl metametodo __newindexIl metametodo __tostringMetametodi aritmetici - Parte 1Metametodi aritmetici - Parte 2Riepilogo - Tabella di sola lettura2Altre funzioni della libreria table
table.concat()Costruzione di tabelle e unpack()table.sort()Ordinamento personalizzato con funzioniRiepilogo - Tabellone dei punteggi più altiEsercitati da solo: Compilatore Lua online