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中,只声明局部变量(包括参数)。函数是在运行时执行包含函数的表达式时,从函数定义创建的值。此类值通常分配给变量。(函数()语法是简写的。)同样,函数不是声明的。这只是一个例子来说明我的函数是如何工作的。它们实在太长了,无法复制到这里,而且问题还是可以回答的(见评论)。