Lua代码的占位符评估
我有一个应用程序,它使用lua文件来配置一些不常见的选项。因此,它主要包含调用应用程序来创建和修改属性的内容;大多数C函数都没有返回值,但有些有返回值。
现在我需要将这些相同的配置文件读取到另一个应用程序中,并在调用函数时执行显著不同的操作(因此我不能使用通用代码)。此外,我只对可能函数的子集感兴趣,并且我认为我可以通过默认忽略(和/或返回nil)任何其他函数调用来得以摆脱。
因此我想知道这里的最佳方法是什么。怎样(从C ++应用程序)可以加载和执行一个lua脚本,使表达式等按正常方式评估,但我可以拦截并处理特定的应用程序定义的C函数,同时仅忽略(如果需要返回nil)调用任何其他C函数?
(注意:我可以访问原始应用程序的词汇,它主要使用luabind;我可以只使用相同的定义并更改实现,但那太脆弱了,因为原始应用程序以后可以添加更多函数。我希望得到更通用的东西。)
目标是获得一小段C代码,我可以将其用作通用占位符。最终结果是“定义的任何内容(标准库例程,在Lua中定义的函数和显式注册的C函数),正常调用;对于任何其他内容,请调用一个特定的例程,而不是引发错误”。最好与luabind兼容。
整个过程由一小段C代码发起,设置Lua环境,加载一组文件,调用一个函数,然后销毁环境。不会有任何持续进行的事情。
原文链接 https://stackoverflow.com/questions/1597940
如何使用setfenv和metatable?你可以使用一个空表替换某个函数的全局环境表。然后,将占位符函数设置为忽略C定义的函数。
local env = {} -- 空环境
local metatbl = {}
function metatbl.__index (tbl, key) -- 提供占位符函数
return function()
print(key .. " called")
return(nil)
end
end
setmetatable(env, metatbl)
function samplefunc() -- 你的Lua代码在这里
globalfunction "xyz" -- 调用占位符函数
end
setfenv(samplefunc, env)
samplefunc()
如果想使用内置函数,例如print
,可以将其推入env表中,例如:
local env = {print = print}
为 nil
设置一个 __call
元方法:
debug.setmetatable(nil, { __call=function () end })
对于 _G
或其他表的 _index
元方法不起作用,因为名称在调用之前被解析。
(如果您是从 C 设置这个方法,则无需使用 debug API 或库。)
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
如果您有一些方式可以区分脚本中的 C 函数和普通的 Lua 函数,您可以迭代所有在 Lua 系统中定义的函数,并且对于每个不在您关心的函数列表中的 C 函数,将该函数的实现替换为简单的 nil 返回。如果所有的 C 绑定函数都整齐地定义在一个表中,这非常容易;如果它们在
_G
中,您需要做一些工作。您关心的函数可以像正常绑定一样通过 luabind 绑定。