我该如何摆脱Lua上的“ metatable已锁定”的问题?以及如何添加getrawmetatable?

问题描述

我希望字符串能够在Lua中使用%运算符,但是每当我这样做时:

getMetatable("").__mod = function(a,b)
        if not b then
                return a
        elseif type(b) == "table" then
                return string.format(a,unpack(b))
        else
                return string.format(a,b)
        end
end

错误

attempt to index string with '__mod'

debug.getMetatable不起作用

debug.getMetatable("").__mod = function(a,b)
        end
end

错误attempt to call a nil value

所以我尝试了getMetatable(""),它返回了"The Metatable is locked"。 如何摆脱Lua中的"The Metatable is locked"杂物? 我对字符串Metatable没有任何要求。我还发现debug.getMetatablenil而不是函数

这也发生在工作空间getMetatable(workspace)和全局游戏getMetatable(game)

我发现合成酶摆脱了这个问题:https://x.synapse.to/docs/development/objects_mts.html 使用名为getrawMetatable函数? 如何添加getrawMetatable

解决方法

如果debug.getmetatable不存在,则一定不能从标准Lua环境中运行脚本。而是从嵌入Lua的应用程序中运行它。

这样的应用程序对它允许您从Lua访问的内容具有完全控制。因此,如果它删除了debug.getmetatable,并且删除了通过getmetatable检索字符串元表的能力(通过为字符串元表提供一个字符串__metatable字段),您将无能为力从Lua本身进行修改所述的metatable。

此外,除非您对环境有控制权(例如:您是嵌入Lua的程序的作者,但如果您是,则已经知道自己做了什么),那通常是不好的形式来操纵Lua的基本方面,例如字符串元表。在这种环境下,Lua用户将不知道对字符串%意味着什么。

只需像其他所有人一样键入string.format