本地函数相互调用

我有两个函数偶尔相互调用,并且它们是模块的本地函数,该模块使用它们构建另一个函数。 该模块与此代码段相似:

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 设置为全局,就不会出现这种情况,但是我希望将它们保留为模块本地函数。

我甚至尝试在声明 iseven 的行之前放置虚拟函数声明(local function isodd() end)。 我还尝试在虚拟函数声明的位置插入 local isodd,但在两种方式中都不起作用,并且我会收到不同类型的错误。

我知道这是因为Lua有闭包,当声明 iseven 时,它会捕获 isodd 的实际值,该值是 nil 或虚拟函数,之后的修改不起作用,但是有没有办法绕过这个问题?

点赞
用户6544989
用户6544989

更好的检查 num%2 - 除法运算的余数

2016-07-21 11:30:33
用户107090
用户107090

问题在于iseven中对isodd的调用使用了_全局_变量,而非后面定义的局部变量。

可以按照 @Egor 的建议使用前向声明:

local iseven, isodd

function iseven(n)
...
end

function isodd(n)
...
end

...
2016-07-21 12:27:43
用户3586583
用户3586583

另一种解决这个问题的方法是使用表格。普通局部变量可能更有效率,但是通过表格,无需管理声明。

local T = {}

local function evenOrOdd(n)
    return T.iseven(n) and "Even" or "Odd"
end

function T.iseven(n)
    -- 代码
end

这个方法的要点是,因为表格在顶部已经定义了,它下面的所有内容都可以访问它,您可以动态更改它的内容。当调用 evenOrOdd 时,T.iseven 应该已经定义,即使在 evenOrOdd 定义时它没有被定义。

2016-07-21 14:07:26