Menu
Coddy logo textTech

O Metamétodo __index

Parte da seção Logic & Flow do Journey de Lua da Coddy — lição 18 de 54.

Agora que você sabe como anexar metatabelas a tabelas, é hora de aprender sobre o metamétodo mais importante: __index. Este metamétodo controla o que acontece quando você tenta acessar uma chave que não existe em uma tabela.

Normalmente, quando você procura uma chave que não está em uma tabela, o Lua retorna nil. Mas quando uma tabela tem uma metatabela com um campo __index, o Lua verificará esse campo em vez disso. Se o __index apontar para outra tabela, o Lua procurará a chave lá:

local defaults = {
    health = 100,
    speed = 10
}

local player = {name = "Alice"}
local meta = {__index = defaults}

setmetatable(player, meta)

print(player.name)    -- Saída: Alice
print(player.health)  -- Saída: 100

Neste exemplo, player possui apenas uma chave name. Quando você acessa player.health, o Lua não a encontra em player, então ele verifica o campo __index da metatabela. Como __index aponta para a tabela defaults, o Lua procura lá e encontra health = 100.

Isso cria um mecanismo de fallback onde uma tabela pode fornecer valores padrão para outra. A tabela original mantém seus próprios valores, mas quaisquer chaves ausentes são procuradas automaticamente na tabela de fallback.

challenge icon

Desafio

Fácil

Escreva uma função createCharacterWithDefaults que recebe name e level e retorna uma tabela de personagem com valores de atributos padrão.

Crie uma tabela de personagem com o nome e nível fornecidos. Use uma metatable com __index para fornecer valores padrão para quaisquer atributos ausentes (health, mana, strength).

Lógica:

  • Crie uma tabela de padrões (defaults) com as chaves: health = 100, mana = 50, strength = 10
  • Crie uma tabela de personagem com as chaves: name (o nome fornecido) e level (o nível fornecido)
  • Crie uma metatable com __index apontando para a tabela de padrões
  • Anexe a metatable à tabela de personagem usando setmetatable()
  • Retorne a tabela de personagem

Parâmetros:

  • name (string): O nome do personagem
  • level (number): O nível do personagem

Retorna: Uma tabela de personagem com name, level e atributos padrão acessíveis através da metatable (table)

Folha de consulta

O metamétodo __index controla o que acontece quando você tenta acessar uma chave que não existe em uma tabela.

Quando uma tabela possui uma metatabela com um campo __index apontando para outra tabela, o Lua procurará as chaves ausentes nessa tabela:

local defaults = {
    health = 100,
    speed = 10
}

local player = {name = "Alice"}
local meta = {__index = defaults}

setmetatable(player, meta)

print(player.name)    -- Saída: Alice
print(player.health)  -- Saída: 100

Isso cria um mecanismo de fallback onde uma tabela pode fornecer valores padrão para outra. A tabela original mantém seus próprios valores, mas quaisquer chaves ausentes são procuradas automaticamente na tabela de fallback.

Experimente você mesmo

function createCharacterWithDefaults(name, level)
    -- Escreva o código aqui
end
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Logic & Flow