最近用OpenResty开发一个产品。新学Lua语言,写了不少脚本。前几天遇到这么一个运行时错误:
2022/01/21 18:57:01 [error] 581744#0: *74 lua entry thread aborted: runtime error: /opt/lua/blacklist.lua:98: attempt to index upvalue 'actions' (a number value)
简化一下,blacklist.lua代码如下:
local actions = require("actions")
local function do_something()
actions.do_something() --gg
end
很奇怪。于是加了日志,发现actions这个变量确实是数字,是一个不认识的浮点数。我以为是变量被篡改了。
别的模块调用actions并没有问题啊,只有这个blacklist模块有问题。而且这样修改一下就正常:
local function do_something()
require("actions").do_something() --good
end
但是原因没查清,不敢就这样放过。查了一个上午,没结论。
到了下午,手气来了……一眼看到actions模块中有这么一行:
local blacklist = require("blacklist")
循环引用!
作为新手的我,还真不知道Lua模块不允许循环引用啊,毕竟解释器没报错。
实际上也不是完全不允许循环引用,只是在模块顶层require的时候有这个限制。
知道原因就好办了:把两个模块中公共代码提取出来放到第三个模块,去掉上面的一个require语句就可以了。