在Lua 5.2中使用“module”函数?

我有一个使用Lua 5.2进行脚本的VC++项目。

我正在尝试将MySQL兼容性实现到该项目中。

我不拥有此项目,因此如果可能的话,我希望尽可能少更改源代码。

我从this extension下载并解压了文件,与可执行文件位于同一基本目录中...在我的Main.lua文件中,我添加了require('DBI')行,如这个维基页面所述要这样做。

但是当我运行应用程序并执行脚本时,我得到:

LUA Fail:
C:\Path\To\bin\DBI.lua:3: attempt to call global 'module' (a nil value)

经过一些简要阅读,我发现module函数在Lua 5.2中已过时...

但是,这个扩展以及其他MySQL扩展需要使用module函数。

那么,解决此问题的方法是什么?

点赞
用户1442917
用户1442917

你可能需要使用 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 库,而不需要重新编译”。

2013-05-31 05:35:47
用户2279620
用户2279620

我使用这个方法快速脚本设置工作中的 5.2 版本,虽然我自己没有使用 module,但我的堆栈中有 luasocketcopas 等之类的库。我怀疑这对你的特殊情况没什么帮助,但在更一般的情况下可能会有所帮助。

本质上,我使用调试库在 Lua 中复制了 C 版本的 module,以设置函数环境。虽然不美观,但能用。

<!--以下是代码块-->
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
2013-05-31 09:51:39