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: 100Neste 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.
Desafio
FácilEscreva 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) elevel(o nível fornecido) - Crie uma metatable com
__indexapontando 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 personagemlevel(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: 100Isso 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
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
1Iteração Avançada de Tabelas
Iterando com pairs()Iterando com ipairs()pairs() vs. ipairs()Revisão - Ficha de Personagem2Mais Funções da Biblioteca Table
table.concat()Construção de tabelas e unpack()table.sort()Ordenação personalizada com funçõesRecapitulação - Placar de recordes