Menu
CoddyTech

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

Una tabella fornisce valori di ripiego fissi; una funzione può calcolare un valore per qualsiasi chiave mancante.

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 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) e level (il livello fornito)
  • Crea una metatabella con __index che punta alla tabella defaults
  • Associa 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