Menu
Coddy logo textTech

Метаметод __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 вектора в удобном для чтения формате.

Это значительно упрощает работу с вашим кодом. Вместо загадочных адресов памяти во время отладки вы получаете осмысленную информацию о том, что содержит ваша таблица.

challenge icon

Задание

Легко

Напишите 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
quiz iconПроверьте себя

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

Все уроки раздела Логика и управление потоком

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