Menu
Coddy logo textTech

setmetatable и getmetatable

Часть раздела Logic & Flow путешествия по Lua на Coddy — урок 17 из 54.

Теперь, когда вы понимаете, что такое метатаблицы концептуально, пришло время научиться работать с ними на практике. Lua предоставляет для этого две основные функции: setmetatable(), чтобы прикрепить метатаблицу к таблице, и getmetatable(), чтобы получить её.

Чтобы прикрепить метатаблицу к таблице, вы используете setmetatable(). Эта функция принимает два аргумента: таблицу, которую вы хотите изменить (основную таблицу), и метатаблицу, которую вы хотите к ней прикрепить:

local myTable = {name = "Alice"}
local myMetatable = {}

setmetatable(myTable, myMetatable)

В этом примере myMetatable теперь прикреплена к myTable. Сама метатаблица пока пуста, но это устанавливает связь между двумя таблицами. Функция setmetatable() также возвращает основную таблицу, что позволяет при необходимости объединять операции в цепочку.

Чтобы получить метатаблицу, прикрепленную к таблице, используйте getmetatable():

local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable)  -- Вывод: true

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

Понимание этих двух функций является основой для всей работы с метатаблицами в Lua. Как только вы научитесь прикреплять и извлекать метатаблицы, вы будете готовы определять метаметоды, которые изменяют поведение ваших таблиц.

challenge icon

Задание

Легко

Напишите функцию attachMetatable, которая принимает mainTable и metaTable и возвращает true, если метатаблица была успешно прикреплена.

Используйте setmetatable() для прикрепления метатаблицы к основной таблице, затем проверьте прикрепление с помощью getmetatable().

Логика:

  • Прикрепите metaTable к mainTable с помощью setmetatable()
  • Получите прикрепленную метатаблицу с помощью getmetatable()
  • Сравните полученную метатаблицу с исходной metaTable
  • Верните true, если они совпадают, иначе false

Параметры:

  • mainTable (table): Таблица, к которой будет прикреплена метатаблица
  • metaTable (table): Метатаблица для прикрепления

Возвращает: true, если метатаблица была успешно прикреплена и проверена, иначе false (boolean)

Шпаргалка

Lua предоставляет две основные функции для работы с метатаблицами:

setmetatable() — прикрепляет метатаблицу к таблице. Принимает два аргумента: основную таблицу и прикрепляемую метатаблицу. Возвращает основную таблицу.

local myTable = {name = "Alice"}
local myMetatable = {}

setmetatable(myTable, myMetatable)

getmetatable() — извлекает метатаблицу, прикрепленную к таблице. Возвращает метатаблицу, если она прикреплена, или nil, если у таблицы нет метатаблицы.

local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable)  -- Вывод: true

Попробуйте сами

function attachMetatable(mainTable, metaTable)
    -- Напишите код здесь
end
quiz iconПроверьте себя

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

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