Il metametodo __index
Fa parte della sezione Logica e flusso del percorso Lua di Coddy. Lezione 18 di 54.
Ora che sai come associare 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 è presente 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à la chiave lì:
local defaults = {
health = 100,
speed = 10
}
local player = {name = "Alice"}
local meta = {__index = defaults}
setmetatable(player, meta)
print(player.name) -- Risultato: Alice
print(player.health) -- Risultato: 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 mantiene i propri valori, ma le chiavi mancanti vengono cercate automaticamente nella tabella di ripiego.
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 qualsiasi statistica mancante (salute, mana, forza).
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 - Collega 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