有没有办法将 lua 函数从 C++ 更改为 nil,例如 changefunction(thefunction) 并且在调用时变为 nil

Posted

技术标签:

【中文标题】有没有办法将 lua 函数从 C++ 更改为 nil,例如 changefunction(thefunction) 并且在调用时变为 nil【英文标题】:Is there a way to change a lua function to nil from C++ like changefunction(thefunction) and it goes to nil when called 【发布时间】:2021-12-20 21:05:44 【问题描述】:

所以基本上我想在我的 lua 沙箱中添加一个 lua 函数,该函数能够将其他函数更改为 nil,例如 changefunction(func),它会输出调用 nil 值的错误,例如:

changefunction(random); print(random()) --[[ goes to nil and errors ]] --

我已经弄清楚如何通过将函数名称放入 changefunction 中来做到这一点,Ex 是 changefunction("random"),它将在 _G 中搜索该函数。但是我遇到的问题是更改位于不是_G的表中的函数。

有什么方法可以使用字符串并能够访问 lua 沙箱中的任何函数?

【问题讨论】:

你究竟为什么要这样做? 这和myFunc = nilmyTable.myFunc = nil不一样吗?我不认为函数会对此有所帮助。 使用它来全局更改函数并跨越所有 lua 文件,因为我已经完成了 func = nil 并且它没有为所有 lua 文件更改它,所以我想通过添加 1 个函数来加快进程一次性完成。 请添加Minimal, Reproducible Example,以便我们查看发生了什么。您说它适用于全局函数,所以我不知道您所说的“它没有为所有 lua 文件更改它”是什么意思。 为什么它被标记在c++ 中? 【参考方案1】:
-- Forward declaration for mutual recursion.
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)
  -- Track circular references, so we don't get an infinite loop.
  visited = visited or 
  visited[t] = true

  -- Search all of t.
  for k, v in pairs(t) do
    if k == f or v == f then
      -- Found it.
      t[k] = nil
    else
      -- Search every key and value for subtables.
      searchNewTable(k, f, visited)
      searchNewTable(v, f, visited)
    end
  end
end

changefunction(_G, random)

请注意,无论您要删除的值是否为函数,此算法的工作原理都是相同的。

我强烈建议changefunction 为要从中消除值的表采用表参数。这是因为某些包含该值的表可能位于局部变量中,因此无法从_G 访问。您必须为每个“主”表调用 changefunction

【讨论】:

以上是关于有没有办法将 lua 函数从 C++ 更改为 nil,例如 changefunction(thefunction) 并且在调用时变为 nil的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中,主函数是编程的入口点,我如何将其更改为其他函数?

使用 python 将 C++ 结构更改为 JSON 字符串

将 Delphi 逐步移植到 C++

有没有办法确定 Lua 函数的签名?

如何在 C++ 中将值 char 数组的类型更改为 int? [复制]

有没有办法使用python将Windows鼠标光标更改为自定义光标?