Форматирование строк
Часть раздела Объектно-ориентированное программирование путешествия по 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 должна возвращать строку. Вы можете форматировать её так, как имеет смысл для вашего объекта, объединяя любые атрибуты в удобное для чтения представление.
Задание
ЛегкоДавайте создадим класс Book, который умеет представляться! Когда вы напрямую выводите книгу, Lua отображает красиво отформатированную строку вместо загадочного адреса памяти — и всё это благодаря метаметоду __tostring.
Вы организуете код в двух файлах:
Book.lua: Определите классBookс помощью стандартного шаблонаprototype. Каждая книга должна хранитьtitleиauthor. Добавьте конструктор:new(title, author)и реализуйте метаметод__tostring, чтобы при выводе книги её информация отображалась в удобном для чтения формате.main.lua: Подключите свой модуль Book, создайте экземпляры книг и напрямую выведите их, чтобы увидеть собственное форматирование строк в действии.
Ваш метод __tostring должен возвращать строку в точно таком формате:
"[title]" by [author]Обратите внимание: в возвращаемой строке title заключён в двойные кавычки.
Вы получите четыре входных значения:
- Название первой книги
- Автор первой книги
- Название второй книги
- Автор второй книги
В основном файле создайте две книги, используя предоставленные входные значения, и напрямую выведите каждую книгу (не вызывая метод, просто 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))
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигурПотренируйтесь самостоятельно: Онлайн-компилятор Lua