Menu
Coddy logo textTech

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 .. ")"
end

Agora, 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.

challenge icon

Desafio

Fácil

Vamos 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 classe Book com o padrão de protótipo padrão. Cada livro deve armazenar um title e um author. Inclua um construtor :new(title, author) e implemente o metamétodo __tostring para 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:

  1. Título do primeiro livro
  2. Autor do primeiro livro
  3. Título do segundo livro
  4. 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 Orwell

Lembre-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 .. ")"
end

Quando 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 receba self
  • 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 __tostring automaticamente

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))

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 Object Oriented Programming