关于两种版本lua的模块(MODULE)调用的方式

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
在这里插入图片描述
这时我们不禁奇怪,明明调用了模块,而且函数本身也是定义的全局函数,但是为什么会显示未定义呢,此时我们回到net文件中发现module(…, package.seeall)这条语句中的module被划掉了。。。
在这里插入图片描述
查看详情我们发现提示:未定义的全局变量 module。(在 Lua 5.1/LuaJIT 中有定义,当前为 Lua 5.4),难道会是lua版本的问题吗?于时我们打开settings.json,将编译器的LUA的版本改成5.1
在这里插入图片描述
保存以后再返回去,发现此时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之类的形式(可能还有其他方式)来调用。

工笔有限,敬请谅解。最后,感谢LUAT社区提供的资料!

可以。Nginx 的 Lua 模块可以通过调用 Java 的 REST 接口来与 Java 交互。一种常见的做法是,在 Nginx 中使用 Lua 脚本来处理 HTTP 请求,然后利用 Lua 的 HTTP 客户端库(如 `lua-resty-http`)向 Java 的 REST 接口发送请求,并获取返回的数据进行处理。 以下是一个简单的示例,展示了如何在 Lua 脚本中使用 `lua-resty-http` 库调用 Java 的 REST 接口: ```lua -- 加载 lua-resty-http 库 local http = require "resty.http" -- 创建 HTTP 客户端对象 local httpc = http.new() -- 构造请求参数 local headers = {["Content-Type"] = "application/json"} local body = '{"name": "John Doe", "age": 30}' local options = {method = "POST", body = body, headers = headers} -- 发送 HTTP 请求 local res, err = httpc:request_uri("http://example.com/api/user", options) -- 检查是否出错 if not res then ngx.log(ngx.ERR, "failed to send request: ", err) return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end -- 打印返回结果 ngx.say(res.body) -- 关闭 HTTP 客户端 httpc:close() ``` 在这个示例中,我们使用 `lua-resty-http` 库创建了一个 HTTP 客户端对象,并使用 `request_uri` 方法向 Java 的 REST 接口发送了一个 POST 请求。请求参数包含一个 JSON 格式的数据,表示一个用户信息。在接收到 Java 返回的数据后,我们将其打印到 Nginx 的页面上。 需要注意的是,这只是一个简单的示例,实际的应用中还需要考虑安全性、性能等方面的问题,例如如何处理异常情况、如何处理 HTTP 请求头、如何优化网络连接等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值