是否有一种方法可以从C ++更改lua函数为空,比如changefunction(thefunction),并且当调用时变为nil?

基本上我想将lua函数添加到我的lua沙箱中,具有将其他函数更改为空的能力,比如changefunction(func),并且它将为调用空值输出错误,例如:

changefunction(random); print(random()) --[[变为nil并出现错误]] --

我已经想出了如何通过在changefunction中放置函数名称来实现,例如changefunction("random"),它会在_G中搜索函数。但我遇到的问题是更改位于不是_G的表中的函数。

是否有一种无需使用字符串并且可以访问lua沙箱中的任何函数的方法来做到这一点?

原文链接 https://stackoverflow.com/questions/69876458

点赞
stackoverflow用户3574628
stackoverflow用户3574628
-- 相互递归的前向声明
local changefunction

-- 查找新表递归函数
local function searchNewTable(t, f, visited)
  if type(t) == 'table' and not visited[t] then
    changefunction(t, f, visited)
  end
end

-- 改变函数
function changefunction(t, f, visited)
  -- 跟踪循环引用,以免产生死循环
  visited = visited or {}
  visited[t] = true

  -- 遍历所有的 t
  for k, v in pairs(t) do
    if k == f or v == f then
      -- 找到了,删除
      t[k] = nil
    else
      -- 在每个键和值中查找子表
      searchNewTable(k, f, visited)
      searchNewTable(v, f, visited)
    end
  end
end

-- 在全局变量中将 random 函数删除
changefunction(_G, random)

-- 注意,无论要移除的值是不是一个函数,这个算法都能起作用。

-- 我强烈建议将 changefunction 设计成有一个表参数,用于从表中删除值。这是因为包含该值的一些表可能在局部变量中,因此无法从 _G 中访问到。对于这些“主要”表,您必须分别调用 changefunction。
2021-11-07 23:12:51