1

通常沙盒会阻止 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”变量的全局变量吗?我应该做些什么具体的事情吗?

谢谢。

4

1 回答 1

1

由有能力的开发人员编写的沙箱不会阻止常规setmetatable功能。例如,维基百科使用Scribunto 扩展,它允许任何人在网站上编写和运行 Lua,它允许不受限制地使用setmetatable. (但是,它确实会阻止debug.setmetatable,以及其他大部分内容debug。)通常,当沙箱确实阻止时setmetatable,这是因为它的开发人员要么不了解 userdata 的工作原理,要么不了解这一点debug.setmetatable并且setmetatable与众不同,并且/或者不明白做什么__metatable。你没有必要限制它。

于 2020-05-12T05:24:29.200 回答