检查元表是否为只读

我正在试图找到一种方法来检查元表是否为只读

例如

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

我希望能够在Roblox中找到一种方法来做到这一点,这样我就可以防止GUI被篡改。

点赞
用户7396148
用户7396148

你可以使用 getmetatable() 来查看元表内容是否受到保护。

示例:

local mt = getmetatable(game)
if mt ~= nil and type(mt) ~= "table" then -- 不完美,因为 __metatable 可能被设置为空表 {}
    print("这个元表受到保护!")
end

或者,如果你想查看表本身是否只读,你需要检查两个行为:

  1. 当你试图向表中添加值时会发生什么
  2. 当你试图在表中更改值时会发生什么。

只读表的例子:

local protected_table = {'1', '2', '3'}
local table  = setmetatable({}, {-- 创建一个带有元表的虚拟表
    __index = function(_, k)
        return protected_table[k]-- 访问只读表
    end,
    __newindex = function()
        error('这个值是只读的。')
    end,
    __pairs = function(_)
        return function(_, k)
            return next(protected_table, k)
        end
    end,
    __metatable = false,
})

可能的交互示例:

table[4] = "4" -- _newindex 设置会生成只读错误

table[1] = "0" -- _newindex 设置会生成只读错误

first = table[1] -- 将检索到只读表的第一个值
2018-12-21 19:03:38