Formatação de Strings
Parte da seção Programação Orientada a Objetos do Journey de Lua da Coddy. Lição 16 de 70.
Quando você usa print diretamente em um objeto, o Lua mostra algo pouco útil, como table: 0x55a.... Apenas um endereço de memória. O metamétodo __tostring permite definir 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 tabela da sua classe. Como a própria classe serve como metatabela para as instâncias, Lua encontra e usa automaticamente essa 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 automaticamente o seu método __tostring:
local hero = Player:new("Luna", 5)
print(hero) -- Saída: Player: Luna (Level 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 criar uma classe Book que saiba se apresentar! Quando você imprime um livro diretamente, Lua exibirá uma string bem formatada 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 usual. Cada livro deve armazenar umtitlee umauthor. Inclua um construtor:new(title, author)e implemente o metamétodo__tostringpara que imprimir 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 personalizada de strings em ação.
Seu método __tostring deve retornar uma string exatamente neste formato:
"[title]" by [author]Observe que o título aparece entre 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 deverá ser:
"The Hobbit" by J.R.R. Tolkien
"1984" by George OrwellLembre-se de que __tostring deve retornar uma string e, como a tabela da sua classe serve como metatabela para as instâncias, Lua encontrará e usará automaticamente sua função __tostring quando você imprimir um livro.
Experimente você mesmo
-- Requer 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 livro 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 Programação Orientada a Objetos
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ânguloClasse CírculoMétodo PerímetroColeção de FormasÁrea TotalFiltrar Formas2Padrã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 FormasPratique por conta própria: Compilador de Lua online