Метаметод __tostring
Часть раздела Логика и управление потоком путешествия по Lua на Coddy. Урок 20 из 54.
Когда вы выводите таблицу в Lua, обычно видите что-то неинформативное вроде table: 0x5f8a20 — всего лишь адрес памяти. Метаметод __tostring позволяет изменить это поведение, точно определив, что должно отображаться при преобразовании вашей таблицы в строку.
Этот метаметод особенно полезен для отладки и создания более аккуратного вывода. Когда Lua нужно преобразовать вашу таблицу в строку (например, при использовании print()), он проверяет, есть ли у таблицы метатаблица с полем __tostring. Если есть, Lua вызывает эту функцию и использует её возвращаемое значение вместо представления по умолчанию.
Вот как это реализовать:
local vector = {x = 3, y = 4}
local meta = {
__tostring = function(t)
return "Vector(" .. t.x .. ", " .. t.y .. ")"
end
}
setmetatable(vector, meta)
print(vector) -- Вывод: Vector(3, 4)function __tostring получает таблицу в качестве аргумента и должна возвращать строку. В этом примере она создаёт форматированную строку, отображающую значения x и y вектора в удобном для чтения формате.
Это значительно упрощает работу с вашим кодом. Вместо загадочных адресов памяти во время отладки вы получаете осмысленную информацию о том, что содержит ваша таблица.
Задание
ЛегкоНапишите function createPoint, которая принимает координаты x и y и возвращает таблицу точки с пользовательским строковым представлением.
Создайте таблицу с полями x и y, присоедините метатаблицу с метаметодом __tostring и верните результат преобразования таблицы в строку с помощью tostring().
Логика:
- Создайте таблицу с ключами
xиy, которым присвоены переданные координаты - Создайте метатаблицу с
__tostring, которая возвращает строку в формате"Point(x, y)" - Присоедините метатаблицу к таблице точки с помощью
setmetatable() - Верните
tostring(point), чтобы получить пользовательское строковое представление
Параметры:
x(число): координата x точкиy(число): координата y точки
Возвращает: пользовательское строковое представление точки в формате "Point(x, y)" (строка)
Попробуйте сами
function createPoint(x, y)
-- Напишите код здесь
end
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутая итерация таблиц
Итерация с помощью pairs()Итерация с помощью ipairs()pairs() против ipairs()Повторение — Лист персонажа2Дополнительные функции библиотеки table
table.concat()Создание таблиц и unpack()table.sort()Пользовательская сортировка с помощью функцийИтоги — Таблица рекордовПотренируйтесь самостоятельно: Онлайн-компилятор Lua