Menu
Coddy logo textTech

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

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

challenge icon

Desafio

Fácil

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

  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 deverá ser:

"The Hobbit" by J.R.R. Tolkien
"1984" by George Orwell

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

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 Programação Orientada a Objetos

Pratique por conta própria: Compilador de Lua online