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するのは、その開発者がユーザーデータの仕組みを理解していないか、それを理解しておらず、debug.setmetatable異なるsetmetatableか、および/または何が何をするのか理解して__metatableいません。あなたがそれを制限する必要はありません。

于 2020-05-12T05:24:29.200 に答える