setmetatable & getmetatable
Parte da seção Logic & Flow do Journey de Lua da Coddy — lição 17 de 54.
Agora que você entende o que são metatabelas conceitualmente, é hora de aprender como realmente trabalhar com elas. Lua fornece duas funções essenciais para isso: setmetatable() para anexar uma metatabela a uma tabela, e getmetatable() para recuperá-la.
Para anexar uma metatabela a uma tabela, você usa setmetatable(). Esta função recebe dois argumentos: a tabela que você deseja modificar (a tabela principal) e a metatabela que você deseja anexar a ela:
local myTable = {name = "Alice"}
local myMetatable = {}
setmetatable(myTable, myMetatable)Neste exemplo, myMetatable está agora vinculada a myTable. A metatabela em si está vazia por enquanto, mas isso estabelece a conexão entre as duas tabelas. A função setmetatable() também retorna a tabela principal, o que permite encadear a operação, se necessário.
Para recuperar a metatabela anexada a uma tabela, você usa getmetatable():
local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable) -- Saída: trueEsta função retorna a metatabela se houver uma anexada, ou nil se a tabela não possuir uma metatabela. Isso é útil quando você precisa verificar ou modificar a metatabela de uma tabela após ela ter sido definida.
Entender essas duas funções é a base para todo o trabalho com metatables em Lua. Uma vez que você consiga anexar e recuperar metatables, você estará pronto para definir metamethods que alteram o comportamento de suas tabelas.
Desafio
FácilEscreva uma função attachMetatable que receba mainTable e metaTable e retorne true se a metatabela foi anexada com sucesso.
Use setmetatable() para anexar a metatabela à tabela principal e, em seguida, verifique a anexação usando getmetatable().
Lógica:
- Anexe
metaTableamainTableusandosetmetatable() - Recupere a metatabela anexada usando
getmetatable() - Compare a metatabela recuperada com a
metaTableoriginal - Retorne
truese elas coincidirem, caso contrário,false
Parâmetros:
mainTable(table): A tabela à qual a metatabela será anexadametaTable(table): A metatabela a ser anexada
Retorna: true se a metatabela foi anexada e verificada com sucesso, caso contrário, false (boolean)
Folha de consulta
Lua fornece duas funções essenciais para trabalhar com metatables:
setmetatable() - Anexa uma metatable a uma tabela. Recebe dois argumentos: a tabela principal e a metatable a ser anexada. Retorna a tabela principal.
local myTable = {name = "Alice"}
local myMetatable = {}
setmetatable(myTable, myMetatable)getmetatable() - Recupera a metatable anexada a uma tabela. Retorna a metatable se houver uma anexada, ou nil se a tabela não possuir uma metatable.
local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable) -- Saída: trueExperimente você mesmo
function attachMetatable(mainTable, metaTable)
-- 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 Personagem4Introdução às Metatabelas
O que é uma Metatabela?setmetatable & getmetatableO Metamétodo __indexO Metamétodo __newindexO Metamétodo __tostringMetamétodos Aritméticos Parte 1Metamétodos Aritméticos Parte 2Recapitulação - Tabela Somente Leitura2Mais 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