我有两个偶尔相互调用的函数,它们是一个模块的本地函数,它使用它们来构建另一个函数。该模块有点类似于这段代码:
local function iseven(n)
if n == 1 then
return false
else
return isodd(n - 1)
end
end
local function isodd(n)
if n == 1 then
return true
else
return iseven(n - 1)
end
end
local evenOrOdd = function(n)
return iseven(n) and "Even" or "Odd"
end
return evenOrOdd
问题是,当从其他文件调用evenOrOdd
时,我收到错误attempt to call global 'isodd' (a nil value)
。
我注意到,如果我将iseven
设置为全局,则不会发生这种情况,但我希望将它们保留在我的模块本地。
我甚至尝试在声明local function isodd() end
的行之前放置一个虚函数声明(iseven
)。我也尝试在虚拟函数声明的位置插入local isodd
,但是两种方式都不起作用,我得到了不同类型的错误。
我知道这是因为Lua有闭包,当iseven
被声明时它会捕获isodd
的实际值,即nil
或虚函数,并在不知道后修改它不算数,但是有办法绕过这个吗?
答案 0 :(得分:5)
问题是isodd
中对iseven
的调用使用了全局变量,而不是后来定义的本地变量。
使用@Egor建议的前向声明:
local iseven, isodd
function iseven(n)
...
end
function isodd(n)
...
end
...
答案 1 :(得分:2)
解决此问题的另一种方法是使用表格。普通的局部变量可能更有效,但是对于表,您不需要管理声明。
local T = {}
local function evenOrOdd(n)
return T.iseven(n) and "Even" or "Odd"
end
function T.iseven(n)
-- code
end
这样做的要点是,因为表格是在顶部定义的,所以它下面的所有内容都可以访问它,你可以动态地改变它的内容。
调用evenOrOdd
时,即使在定义T.iseven
时未定义evenOrOdd
,也应该已定义{{1}}。
答案 2 :(得分:-1)
更好地检查self.crawl_link.domain.product_infos.pluck(:id_tag)
- 除法的剩余部分