Метаметод __tostring
Часть раздела Logic & Flow путешествия по 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)Функция __tostring получает таблицу в качестве аргумента и должна возвращать строку. В этом примере она создает отформатированную строку, отображающую значения x и y вектора в читаемом формате.
Это значительно упрощает работу с вашим кодом. Вместо того чтобы видеть непонятные адреса памяти во время отладки, вы получаете осмысленную информацию о содержимом вашей таблицы.
Задание
ЛегкоНапишите функцию createPoint, которая принимает координаты x и y и возвращает таблицу точки с пользовательским строковым представлением.
Создайте таблицу с полями x и y, прикрепите метатаблицу с метаметодом __tostring и верните результат преобразования таблицы в строку с помощью tostring().
Логика:
- Создайте таблицу с ключами
xиy, установленными в соответствии с предоставленными координатами - Создайте метатаблицу с
__tostring, которая возвращает строку в формате"Point(x, y)" - Прикрепите метатаблицу к таблице точки с помощью
setmetatable() - Верните
tostring(point), чтобы получить пользовательское строковое представление
Параметры:
x(number): Координата x точкиy(number): Координата y точки
Возвращает: Пользовательское строковое представление точки в формате "Point(x, y)" (string)
Шпаргалка
Метаметод __tostring позволяет настроить способ отображения таблицы при её преобразовании в строку. По умолчанию при выводе таблицы на экран отображается адрес памяти, например table: 0x5f8a20.
Когда Lua преобразует таблицу в строку (например, с помощью print()), она проверяет, есть ли у таблицы метатаблица с полем __tostring. Если оно есть, Lua вызывает эту функцию и использует возвращаемое ею значение.
Функция __tostring получает таблицу в качестве аргумента и должна возвращать строку:
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)Вы также можете явно преобразовать таблицу в строку с помощью tostring(), что вызовет метаметод __tostring, если он определен.
Попробуйте сами
function createPoint(x, y)
-- Напишите код здесь
end
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутая итерация таблиц
Итерация с помощью pairs()Итерация с помощью ipairs()pairs() против ipairs()Повторение — Лист персонажа2Дополнительные функции библиотеки table
table.concat()Создание таблиц и unpack()table.sort()Пользовательская сортировка с помощью функцийИтоги — Таблица рекордов