有没有办法将 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 = nil
或myTable.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 字符串