Formatação de Strings
Parte da seção Object Oriented Programming do Journey de Lua da Coddy — lição 16 de 70.
Quando você imprime um objeto diretamente, o Lua mostra algo pouco útil como table: 0x55a...—apenas um endereço de memória. O metamétodo __tostring permite que você defina exatamente qual string representa seu objeto quando ele é impresso ou convertido em texto.
No padrão de classe, você adiciona __tostring como uma função na sua tabela de classe. Como a própria classe serve como a metatabela para instâncias, o Lua encontra e usa automaticamente esta função:
local Player = {}
Player.__index = Player
function Player:new(name, level)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.level = level
return instance
end
function Player:__tostring()
return "Player: " .. self.name .. " (Level " .. self.level .. ")"
endAgora, quando você imprime uma instância de Player, o Lua chama o seu método __tostring automaticamente:
local hero = Player:new("Luna", 5)
print(hero) -- Saída: Player: Luna (Nível 5)Observe que __tostring usa a sintaxe de dois pontos e recebe self, dando a você acesso a todos os dados da instância. A função deve retornar uma string — você pode formatá-la da maneira que fizer sentido para o seu objeto, combinando quaisquer atributos em uma representação legível.
Desafio
FácilVamos construir uma classe Book que saiba como se apresentar! Quando você imprimir um livro diretamente, o Lua exibirá uma string formatada de maneira agradável em vez de um endereço de memória enigmático — tudo graças ao metamétodo __tostring.
Você organizará seu código em dois arquivos:
Book.lua: Defina sua classeBookcom o padrão de protótipo padrão. Cada livro deve armazenar umtitlee umauthor. Inclua um construtor:new(title, author)e implemente o metamétodo__tostringpara que a impressão de um livro exiba suas informações em um formato legível.main.lua: Importe seu módulo Book, crie instâncias de livros e imprima-as diretamente para ver sua formatação de string personalizada em ação.
Seu método __tostring deve retornar uma string exatamente neste formato:
"[title]" by [author]Observe que o título está envolvido por aspas duplas dentro da string de saída.
Você receberá quatro entradas:
- Título do primeiro livro
- Autor do primeiro livro
- Título do segundo livro
- Autor do segundo livro
Em seu arquivo principal, crie dois livros usando as entradas fornecidas e imprima cada livro diretamente (não chamando um método — apenas print(book)). Cada livro deve aparecer em sua própria linha.
Por exemplo, se as entradas forem The Hobbit, J.R.R. Tolkien, 1984 e George Orwell, a saída deve ser:
"The Hobbit" by J.R.R. Tolkien
"1984" by George OrwellLembre-se de que __tostring deve retornar uma string e, como sua tabela de classe serve como a metatabela para as instâncias, o Lua encontrará e usará automaticamente sua função __tostring quando você imprimir um livro.
Folha de consulta
O metamétodo __tostring define como um objeto é representado como uma string quando impresso ou convertido para texto.
Sem o __tostring, imprimir um objeto mostra apenas seu endereço de memória:
print(someObject) -- Saída: table: 0x55a...Adicione o __tostring como um método em sua classe para personalizar a representação em string:
local Player = {}
Player.__index = Player
function Player:new(name, level)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.level = level
return instance
end
function Player:__tostring()
return "Player: " .. self.name .. " (Level " .. self.level .. ")"
endQuando você imprime uma instância, o Lua chama automaticamente o __tostring:
local hero = Player:new("Luna", 5)
print(hero) -- Saída: Player: Luna (Level 5)Pontos-chave:
- Use a sintaxe de dois pontos (
:) para que o método recebaself - Deve retornar uma string
- Acesse os dados da instância através de
self - Como a tabela da classe serve como a metatabela, o Lua encontra o
__tostringautomaticamente
Experimente você mesmo
-- Importa o módulo Book
local Book = require('Book')
-- Lê as entradas
local title1 = io.read()
local author1 = io.read()
local title2 = io.read()
local author2 = io.read()
-- TODO: Crie duas instâncias de livros usando Book:new()
-- TODO: Imprima cada livro diretamente (apenas use print(book))
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Object Oriented Programming
1O Conceito 'Self'
Tabelas com Funções'self' ExplícitoA Sintaxe de Dois-pontosPonto vs Dois-pontosRecapitulação - Movendo o Ponto4Projeto: Banco Digital
Configuração do ProjetoMétodo de Depósito7Polimorfismo e Sobrescrita
Sobrescrita de MétodosChamando Métodos da Classe PaiDuck TypingInterface ComumVerificando o TipoRecapitulação - Papéis de Funcionários10Projeto: Gerenciador de Formas
Configuração do ProjetoClasse Retângulo2Padrão de Protótipo de Classe
O Conceito de ProtótipoVinculando com __indexO Construtor :new()Inicializando AtributosInstâncias IndependentesRecapitulação - Fábrica de Carros5Sobrecarga de Operadores em POO
Somando ObjetosSubtraindo ObjetosConcatenando ObjetosComparando Objetos (<, >)Recapitulação - Matemática de Carteira8Encapsulamento
Convenções de NomenclaturaClosures para PrivacidadeAcesso via ClosuresTabelas Somente LeituraLógica de ValidaçãoRecapitulação - Cofre Seguro11Padrões de Projeto (Lite)
Funções FactoryTabela SingletonPadrão IteratorObserver (Listener)Recapitulação - Logger Factory3Estado e Comportamento do Objeto
Variáveis de InstânciaMétodos GetterMétodos SetterPropriedades CalculadasFormatação de StringsVerificações de IgualdadeRecapitulação - Nota do Aluno6Fundamentos de Herança
Configurando a HerançaHerdando MétodosEstendendo o ConstrutorAdicionando Métodos FilhosCompartilhado vs ÚnicoRecapitulação - Hierarquia de Formas