Проверьте, доступен ли Metatable только для чтения - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь найти способ проверить, доступен ли Metatable только для чтения или нет

, например,

local mt = metatable(game)
if mt == "readonly" do
print("Attempt to modify Metatables")
end

Я надеюсь, что есть способ сделать это для Roblox, поэтомуЯ могу предотвратить вмешательство GUI

1 Ответ

0 голосов
/ 21 декабря 2018

Вы можете использовать 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

В качестве альтернативы, если вы хотите посмотреть, читается ли сама таблица-только вам нужно будет проверить два поведения

  1. Что происходит, когда вы пытаетесь добавить значение в таблицу
  2. Что происходит, когда вы пытаетесь изменить значение в таблице.

Пример таблицы только для чтения:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...