LUA5.1以及LUA5.4对于模块调用的不同方式

lua作为4G芯片的应用编程语言,应用范围可以说是很广泛了。而使用这门语言自然也是需要一款编译器了,这边我们采用VSCODE作为编译器(下载以及插件的安装就不多说了,详见合宙LUAT社区(http://ask.openluat.com/))。
打开VSCODE并成功安装插件之后,我们先使用lua的5.4版本。首先我们新建一个main.lua文件,然后我们使用require来进行模块的调用。比方说我们这里调用“net.lua”文件(文件来源于LUAT社区库文件),使用require调用模块自然是为了使用net上面的函数了,那么假设此时我们在main里面调用了startQueryAll(…)这个函数

module(..., package.seeall)
function startQueryAll(...)
    local arg = {...}
    csqQueryPoll(arg[1])           --csqQueryPoll为net文件内部调用的函数
    cengQueryPoll(arg[2])
    if flyMode then
        log.info("sim.startQuerAll", "flyMode:", flyMode)       --log是调用另一个模块
    end
    return true
end

那么此时我们在main中就会这么写

require "net"
net.startQueryAll(60000, 60000)

这是一个标准的lua语言模块调用的格式,但此时VSCODE反应了一个信息,在main中net.startQueryAll(60000, 60000)这条语句中的net被标明下划线,我们将光标移上去发现未定义的全局变量 net

java中调用大漠 lua调用大漠_程序人生


这时我们不禁奇怪,明明调用了模块,而且函数本身也是定义的全局函数,但是为什么会显示未定义呢,此时我们回到net文件中发现module(…, package.seeall)这条语句中的module被划掉了。。。

java中调用大漠 lua调用大漠_lua_02


查看详情我们发现提示:未定义的全局变量 module。(在 Lua 5.1/LuaJIT 中有定义,当前为 Lua 5.4),难道会是lua版本的问题吗?于时我们打开settings.json,将编译器的LUA的版本改成5.1

java中调用大漠 lua调用大漠_java中调用大漠_03


保存以后再返回去,发现此时net文件中的module已经恢复正常了,回到main之后,我们发现net下方的波浪线警告还是存在,标明全局变量net未定义,于是我回到LUAT社区寻找资料,终于在合宙的官方教程中找到了解决办法,我们在net文件的最后加上如下代码:

return {
    startQueryAll = startQueryAll
}

让返回值以table的形式返回,然后在main中对于net文件的require改成如下形式:

local net = require "net"

此时,我们发现,函数调用没有警告了,也就是说模块调用成功了,这时我们尝试着把net文件中的 module(…, package.seeall) 删除掉,此时我们发现在main中的net文件的函数依旧可以用,然后我们再回到settings.json中将版本改回5.4,main函数中的net文件函数还是可以用的。
综上所述,我们发现LUA在版本升级的过程中似乎在将 module(…, package.seeall) 给逐渐淡化,转而采用return一个table之类的形式(可能还有其他方式)来调用。