setmetatable 到底是什么,我如何为了安全性而避免它?

通常沙箱会像这样阻止 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' 变量吗?我应该做一些特定的事情吗?

谢谢。

点赞
用户7509065
用户7509065

有能力的开发者编写的沙盒不会阻止常规的 setmetatable 函数。例如,维基百科使用 Scribunto 扩展程序,它允许任何人在网站上编写和运行 Lua,并允许无限制地使用 setmetatable。(但是,它会阻止 debug.setmetatable,以及大部分其它 debug 功能。) 一般来说,当一个沙盒阻止了 setmetatable,这是因为其开发人员要么不理解 userdata 的工作原理,要么不理解 debug.setmetatablesetmetatable 的区别,要么不理解 __metatable 的作用。你不需要限制它。

2020-05-12 05:24:29