Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

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

Все уроки раздела Logic & Flow