Menu
Coddy logo textTech

Форматирование строк

Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 16 из 70.

Когда вы выводите объект напрямую, Lua показывает что-то бесполезное, например table: 0x55a.... Просто адрес памяти. Метаметод __tostring позволяет точно определить, какая строка представляет ваш объект при его выводе или преобразовании в текст.

В шаблоне класса вы добавляете __tostring как функцию в таблицу класса. Поскольку сам класс служит в качестве metatable для instances, Lua автоматически находит и использует эту функцию:

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

Теперь, когда вы выводите экземпляр Player, Lua автоматически вызывает ваш метод __tostring:

local hero = Player:new("Luna", 5)
print(hero)  -- Вывод: Player: Luna (Level 5)

Обратите внимание, что __tostring использует синтаксис с двоеточием и получает self, предоставляя вам доступ ко всем данным instance. function должна возвращать строку. Вы можете форматировать её так, как имеет смысл для вашего объекта, объединяя любые атрибуты в удобное для чтения представление.

challenge icon

Задание

Легко

Давайте создадим класс Book, который умеет представляться! Когда вы напрямую выводите книгу, Lua отображает красиво отформатированную строку вместо загадочного адреса памяти — и всё это благодаря метаметоду __tostring.

Вы организуете код в двух файлах:

  • Book.lua: Определите класс Book с помощью стандартного шаблона prototype. Каждая книга должна хранить title и author. Добавьте конструктор :new(title, author) и реализуйте метаметод __tostring, чтобы при выводе книги её информация отображалась в удобном для чтения формате.
  • main.lua: Подключите свой модуль Book, создайте экземпляры книг и напрямую выведите их, чтобы увидеть собственное форматирование строк в действии.

Ваш метод __tostring должен возвращать строку в точно таком формате:

"[title]" by [author]

Обратите внимание: в возвращаемой строке title заключён в двойные кавычки.

Вы получите четыре входных значения:

  1. Название первой книги
  2. Автор первой книги
  3. Название второй книги
  4. Автор второй книги

В основном файле создайте две книги, используя предоставленные входные значения, и напрямую выведите каждую книгу (не вызывая метод, просто print(book)). Каждая книга должна отображаться на отдельной строке.

Например, если входные значения — The Hobbit, J.R.R. Tolkien, 1984 и George Orwell, результат должен быть таким:

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

Помните, что __tostring должен возвращать строку, а поскольку таблица вашего класса служит метатаблицей для экземпляров, Lua автоматически найдёт и использует вашу функцию __tostring, когда вы выводите книгу.

Попробуйте сами

-- Подключить модуль Book
local Book = require('Book')

-- Считать ввод
local title1 = io.read()
local author1 = io.read()
local title2 = io.read()
local author2 = io.read()

-- TODO: Создать два экземпляра книги с помощью Book:new()


-- TODO: Вывести каждую книгу напрямую (просто используйте print(book))

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Lua