С Программирование на Lua, 4-е издание , глава 20:
Функции setmetatable
и getmetatable
также используют мета-поле, в данном случае для защиты метатаблиц. Предположим, что мы хотим защитить наши наборы, чтобы пользователи не могли ни видеть, ни изменять свои метатаблицы. Если мы установим поле __metatable
в метатаблице, getmetatable вернет значение этого поля, тогда как setmetatable повыситошибка:
mt.__metatable = "not your business"
s1 = Set.new{}
print(getmetatable(s1)) --> not your business
setmetatable(s1, {})
stdin:1: cannot change protected metatable
Итак, ваш ответ?Установите поле __metatable
, чтобы запретить доступ к метатаблице таблицы.Сделайте это для всех таблиц, которые вам нужно защищать.