Menu
Coddy logo textTech

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: 100

In 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.

challenge icon

Sfida

Facile

Scrivi 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) e level (il livello fornito)
  • Crea una metatabella con __index che punta alla tabella defaults
  • Collega la metatabella alla tabella del personaggio usando setmetatable()
  • Restituisci la tabella del personaggio

Parametri:

  • name (stringa): Il nome del personaggio
  • level (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
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Lua online