setmetatable 到底是什么,出于安全原因我该如何避免它?

What exactly is setmetatable, and how do I avoid it for security reasons?

通常沙箱会阻止 setmetatable,如下所示:

local function memoize(f)

  local mt = {}
  local t = setmetatable({}, mt)

  function mt:__index(k)
    local v = f(k)
    t[k] = v
    return v
  end

  return t
end

问题是,我不想使用 setmetatable。它到底是什么,我将如何解决它?在上述情况下,它只是一个复制的 'mt' 变量的全局变量吗?有什么我应该做的具体事情吗?

谢谢。

有能力的开发人员编写的沙盒不会阻止常规 setmetatable 功能。例如,维基百科使用 the Scribunto extension,它允许任何人在网站上写 运行 Lua,并且允许不受限制地使用 setmetatable。 (但是,它确实会阻止 debug.setmetatable,以及 debug 的大部分其他内容。)一般来说,当沙箱确实会阻止 setmetatable,这是因为它的开发人员要么不理解userdata 是如何工作的,不明白 debug.setmetatablesetmetatable 是不同的,and/or 不明白 __metatable 是做什么的。不需要你去限制。