Lua - Как мне разбить мета-таблицы или сделать их непригодными для использования?
Так что в моей игре большинство эксплуататоров используют метатаблицы, чтобы остановить запреты, и я хотел бы снять их, я не использую их, и это только навредит эксплуататорам. Даже если это сломает другие части Луа, я могу и исправлю это, но это нужно прекратить, и это мой лучший выбор.
1 ответ
Из программирования на Lua, 4-е издание, глава 20:
Функции
setmetatable
а такжеgetmetatable
также используйте метаполе, в этом случае для защиты метатаблицы. Предположим, мы хотим защитить наши наборы, чтобы пользователи не могли ни видеть, ни изменять свои метатаблицы. Если мы установим__metatable
Поле в 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
поле для предотвращения доступа к таблице метатабельный. Сделайте это для всех таблиц, которые вам нужно защитить.