O Metamétodo __tostring
Parte da seção Lógica e Fluxo do Journey de Lua da Coddy. Lição 20 de 54.
Quando você imprime uma tabela em Lua, normalmente vê algo pouco útil, como table: 0x5f8a20, apenas um endereço de memória. O metamétodo __tostring permite alterar esse comportamento, definindo exatamente o que deve ser exibido quando sua tabela é convertida em uma string.
Este metamétodo é particularmente útil para depuração e para criar uma saída mais limpa. Quando o Lua precisa converter sua tabela em uma string (como ao usar print()), ele verifica se a tabela tem uma metatabela com um campo __tostring. Se tiver, o Lua chama essa função e usa o valor retornado por ela em vez da representação padrão.
Veja como implementá-lo:
local vector = {x = 3, y = 4}
local meta = {
__tostring = function(t)
return "Vector(" .. t.x .. ", " .. t.y .. ")"
end
}
setmetatable(vector, meta)
print(vector) -- Saída: Vector(3, 4)A função __tostring recebe a tabela como seu argumento e deve retornar uma string. Neste exemplo, ela constrói uma string formatada que mostra os valores x e y do vetor em um formato legível.
Isso torna seu código muito mais fácil de trabalhar. Em vez de ver endereços de memória enigmáticos durante a depuração, você obtém informações significativas sobre o que sua tabela contém.
Desafio
FácilEscreva uma função createPoint que receba as coordenadas x e y e retorne uma tabela de ponto com uma representação de string personalizada.
Crie uma tabela com os campos x e y, associe uma metatabela com o metamétodo __tostring e retorne o resultado da conversão da tabela em uma string usando tostring().
Lógica:
- Crie uma tabela com as chaves
xeydefinidas como as coordenadas fornecidas - Crie uma metatabela com
__tostringque retorne uma string no formato"Point(x, y)" - Associe a metatabela à tabela de ponto usando
setmetatable() - Retorne
tostring(point)para obter a representação de string personalizada
Parâmetros:
x(número): A coordenada x do pontoy(número): A coordenada y do ponto
Retorno: A representação de string personalizada do ponto no formato "Point(x, y)" (string)
Experimente você mesmo
function createPoint(x, y)
-- 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 Lógica e Fluxo
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çõesRevisão - Placar de pontuações máximasPratique por conta própria: Compilador de Lua online