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. Как только вы научитесь прикреплять и извлекать метатаблицы, вы будете готовы определять метаметоды, которые изменяют поведение ваших таблиц.
Задание
ЛегкоНапишите функцию 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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутая итерация таблиц
Итерация с помощью pairs()Итерация с помощью ipairs()pairs() против ipairs()Повторение — Лист персонажа4Введение в метатаблицы
Что такое метатаблица?setmetatable и getmetatableМетаметод __indexМетаметод __newindexМетаметод __tostringАрифметические метаметоды. Часть 1Арифметические метаметоды. Часть 2Итоги — Таблица только для чтения2Дополнительные функции библиотеки table
table.concat()Создание таблиц и unpack()table.sort()Пользовательская сортировка с помощью функцийИтоги — Таблица рекордов