Menu
Coddy logo textTech

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

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

challenge icon

Desafio

Fácil

Escreva 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 metaTable a mainTable usando setmetatable()
  • Recupere a metatabela anexada usando getmetatable()
  • Compare a metatabela recuperada com a metaTable original
  • Retorne true se elas coincidirem, caso contrário, false

Parâmetros:

  • mainTable (table): A tabela à qual a metatabela será anexada
  • metaTable (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: true

Experimente você mesmo

function attachMetatable(mainTable, metaTable)
    -- 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