在 Lua 5.2 中使用 'module' 函数?
Using the 'module' function in Lua 5.2?
我有一个vc++项目,使用Lua 5.2编写脚本。
我正试图实现MySQL兼容性到这个项目。
我不是这个项目的所有者,所以我希望尽可能少地修改源代码,如果有的话。
我已经下载并解压缩了文件从这个扩展到相同的基本目录作为可执行文件…在我的Main.lua
文件中,我已经添加了require('DBI')
行,如本wiki页面所述。
但是当我运行应用程序并执行脚本时,我得到:
LUA Fail:
C:PathTobinDBI.lua:3: attempt to call global 'module' (a nil value)
经过一些简单的阅读,我发现模块函数在Lua 5.2中贬值了…
但是这个扩展,以及其他MySQL扩展,需要使用模块函数。
那么这个问题的解决方法是什么呢?
你可能需要用LUA_COMPAT_MODULE编译你的Lua实例;根据源代码:"LUA_COMPAT_MODULE控制与先前模块函数'module' (Lua)和'luaL_register' (C)的兼容性"。
这还不够,因为模块本身是用Lua 5.1 API编写的。你可以试着找到它的Lua 5.2版本,或者使用像Peter Cawley的TwoFace这样的东西,"允许Lua 5.2程序加载大多数5.1 C库,而不需要任何重新编译"。
我使用这作为一种快速而肮脏的方法来让我的大部分脚本设置在5.2中工作。我自己没有使用模块,但在我的堆栈中有luassocket, copas等。我怀疑这对你的具体情况是否有帮助,但可能在更普遍的情况下有一些用处。
基本上,我在lua中复制了C版本的模块,使用调试库来设置函数环境。不是很漂亮,但是嘿。
if not module then
function module(modname,...)
local function findtable(tbl,fname)
for key in string.gmatch(fname,"([%w_]+)") do
if key and key~="" then
local val = rawget(tbl,key)
if not val then
local field = {}
tbl[key]=field
tbl = field
elseif type(val)~="table" then
return nil
else
tbl = val
end
end
end
return tbl
end
assert(type(modname)=="string")
local value,modul = package.loaded[modname]
if type(value)~="table" then
modul = findtable(_G,modname)
assert(modul,"name conflict for module '"..modname.."'" )
package.loaded[modname] = modul
else
modul = value
end
local name = modul._NAME
if not name then
modul._M = modul
modul._NAME = modname
modul._PACKAGE = string.match(modname,"([%w%._]*)%.[%w_]*$")
end
local func = debug.getinfo(2,"f").func
debug.setupvalue(func,1,modul)
for _,f in ipairs{...} do f(modul) end
end
function package.seeall(modul)
setmetatable(modul,{__index=_G})
end
end
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- win32 API 函数 GetModuleFileName 或 GetModuleHandle 中的"Module"是什么?
- 在 Lua 5.2 中使用 'module' 函数?
- Swig csclassmodifiers对C函数的Module类不起作用
- LNK2019 / module没有定义init函数