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 поле для предотвращения доступа к таблице метатабельный. Сделайте это для всех таблиц, которые вам нужно защитить.

Другие вопросы по тегам