如何在Lua中摆脱“The metatable is locked”?如何添加getrawmetatable?

我希望在Lua中可以使用“%”运算符,但是每当我这样做时:

getmetatable(“”).__mod = function(a, b)
        if not b then
                return a
        elseif type(b) == “tablethen
                return string.format(a, unpack(b))
        else
                return string.format(a, b)
        end
end

报错了

尝试使用“__mod”索引字符串

debug.getmetatable不起作用

debug.getmetatable(“”).__mod = function(a, b)
        if not b then
                return a
        elseif type(b) == “tablethen
                return string.format(a, unpack(b))
        else
                return string.format(a, b)
        end
end

会报错“尝试调用一个空值”

所以我尝试了一下getmetatable(“”)并返回了“The metatable is locked”。 如何在Lua中摆脱“The metatable is locked”? 我没有对字符串的元表进行任何更改。我还发现debug.getmetatable是一个nil而不是一个函数。

这个问题也会发生在workspacegetmetatable(workspace)和游戏全局的getmetatable(game)

我发现Synapse使用了一个名为getrawmetatable的函数来解决这个问题:https://x.synapse.to/docs/development/objects_mts.html 如何添加getrawmetatable

点赞
用户734069
用户734069

如果 debug.getmetatable 不存在,则表示您不是从标准 Lua 环境运行脚本。相反,您正在使用嵌入 Lua 的应用程序运行它。

此类应用程序完全控制您从 Lua 能够访问的内容。因此,如果它删除了 debug.getmetatable,并删除了通过 getmetatable 检索字符串元表的功能(通过为字符串元表设置一个 __metatable 字段,该字段是一个字符串),则您无法从 Lua 中对元表进行修改。

此外,除非您有对环境的控制权(即:您是嵌入 Lua 的程序的 _作者_,但如果是这样,您已经知道自己做了什么),一般不建议操纵像字符串元表这样的 Lua 基本方面。在这种环境中使用 Lua 的用户将无法理解对字符串进行 % 操作的含义。

与其他人一样,只需键入 string.format 即可。

2020-08-25 16:01:39