O Metamétodo __tostring
Parte da seção Logic & Flow do Journey de Lua da Coddy — lição 20 de 54.
Quando você imprime uma tabela em Lua, você normalmente vê algo pouco útil como table: 0x5f8a20 — apenas um endereço de memória. O metamétodo __tostring permite que você altere esse comportamento, definindo exatamente o que deve ser exibido quando sua tabela for 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 possui uma metatabela com um campo __tostring. Se possuir, o Lua chama essa função e usa seu valor de retorno em vez da representação padrão.
Veja como implementar:
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 mostrando 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, anexe uma metatabela com o metamétodo __tostring e retorne o resultado da conversão da tabela para uma string usando tostring().
Lógica:
- Crie uma tabela com as chaves
xeydefinidas para as coordenadas fornecidas - Crie uma metatabela com
__tostringque retorne uma string no formato"Point(x, y)" - Anexe a metatabela à tabela de ponto usando
setmetatable() - Retorne
tostring(point)para obter a representação de string personalizada
Parâmetros:
x(number): A coordenada x do pontoy(number): A coordenada y do ponto
Retorna: A representação de string personalizada do ponto no formato "Point(x, y)" (string)
Folha de consulta
O metamétodo __tostring permite que você personalize como uma tabela é exibida quando convertida para uma string. Por padrão, imprimir uma tabela mostra um endereço de memória como table: 0x5f8a20.
Quando o Lua converte uma tabela para uma string (como com print()), ele verifica se a tabela possui uma metatabela com um campo __tostring. Se estiver presente, o Lua chama essa função e usa seu valor de retorno.
A função __tostring recebe a tabela como seu argumento e deve retornar uma string:
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)Você também pode converter explicitamente uma tabela para uma string usando tostring(), o que invocará o metamétodo __tostring se estiver definido.
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 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