本地函数互相调用

时间:2016-07-21 11:04:36

标签: function recursion lua local

我有两个偶尔相互调用的函数,它们是一个模块的本地函数,它使用它们来构建另一个函数。该模块有点类似于这段代码:

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或虚函数,并在不知道后修改它不算数,但是有办法绕过这个吗?

3 个答案:

答案 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) - 除法的剩余部分