Function 相互调用的本地函数

Function 相互调用的本地函数,function,recursion,lua,local,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 retu

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

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
时,我得到错误
尝试调用全局“isodd”(一个nil值)

我注意到,如果我将
iseven
设置为global,则不会发生这种情况,但我希望将它们保留在模块的本地

我甚至尝试在声明
iseven
的行之前放置一个伪函数声明(
localfunction isodd()end
)。我还尝试在伪函数声明的位置插入
local isodd
,但这两种方法都不起作用,我得到了不同类型的错误


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

最好检查一下
num%2
-除法的剩余部分

问题是
iseven
中对
isodd
的调用使用了一个全局变量,而不是后面定义的局部变量

使用@Egor建议的转发声明:

local iseven, isodd

function iseven(n)
...
end

function isodd(n)
...
end

...

解决这个问题的另一种方法是使用表。普通局部变量可能更有效,但对于表,您不需要管理声明

local T = {}

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

function T.iseven(n)
    -- code
end
其要点是,因为表是在顶部定义的,所以它下面的所有内容都可以访问它,并且您可以动态更改它的内容。
调用
evenOrOdd
时,即使在定义
evenOrOdd
时未定义
T.iseven
也应在那时定义。

Lua中的正向声明示例:
local f;局部函数g()返回f()结束;函数f()返回g()结束
@Egor Skriptunoff哦,对了。正如我在问题中所说,我试过了。但是我似乎忘记了在函数isodd(n)之前删除
local
,我得到了
尝试调用upvalue'isodd'(一个零值)
错误。谢谢。您提供的代码的错误消息应该是
尝试调用全局“isodd”(一个nil值)
,这应该可以解释发生了什么。小心从其他语言继承“转发声明”的概念。没有要求以后有“实际声明”。在Lua中,只声明局部变量(包括参数)。函数是在运行时执行包含函数的表达式时,从函数定义创建的值。此类值通常分配给变量。(函数()语法是简写的。)同样,函数不是声明的。这只是一个例子来说明我的函数是如何工作的。它们实在太长了,无法复制到这里,而且问题还是可以回答的(见评论)。