我知道这个问题看起来很简单,但我想知道在Lua中创建函数的两种方法之间的区别:
local myFunction = function()
--code code code
end
或者做这个
local function myFunction()
--code code code
end
如果函数是递归的,则会发生差异。在第一种情况下,"函数"名称还不在函数体内部的范围内,因此任何递归调用实际上都引用了在定义局部变量之前在范围内的"myFunction"的任何版本(大多数情况下,这是一个空的全局变量)。
fac = "oldvalue"
local fac = function()
print(fac) --prints a string
end
为了能够用赋值模式编写递归函数,可以做的一件事是预先声明变量:
local myFunction
myFunction = function()
-- ...
end
预定义变量恰好也是定义一对相互递归的局部函数的唯一方法:
local even, odd
even = function(n) if n == 0 then return true else return odd(n-1) end end
odd = function(n) if n == 0 then return false else return even(n-1) end end
不同之处在于根据手册:
声明
local function f () body end
转换为
local f; f = function () body end
不到
local f = function () body end
(只有当函数体包含对f的引用时,这才有区别。)
主要原因是变量的作用域(变量可见的地方)在局部语句之后开始,如果函数是递归的,它不会引用自己,而是引用以前的局部或全局f
。