Вы можете использовать getmetatable()
, чтобы увидеть, защищено ли содержимое метатаблицы.
Пример:
local mt = getmetatable(game)
if mt and type(mt) ~= "table" do -- not perfect, as someone could set __metatable to {}
print("This metatable is protected!")
end
В качестве альтернативы, если вы хотите посмотреть, читается ли сама таблица-только вам нужно будет проверить два поведения
- Что происходит, когда вы пытаетесь добавить значение в таблицу
- Что происходит, когда вы пытаетесь изменить значение в таблице.
Пример таблицы только для чтения:
local protected_table = {'1', '2', '3'}
local table = setmetatable({}, {-- create a dumby table with a metatable
__index = function(_, k)
return protected_table[k]-- access protected table
end,
__newindex = function()
error('This value is read-only.')
end,
__pairs = function(_)
return function(_, k)
return next(protected_table, k)
end
end,
__metatable = false,
})
Примеры возможных взаимодействий:
table[4] = "4" -- read-only error will be generated by _newindex setting
table[1] = "0" -- read-only error will be generated by _newindex setting
first = table[1] -- will retrieve first value of protected_table