Lua函数调用报错

之前的项目开发中有听到同事提及过有一种写法函数在调用时会报错,今天在看书的过程中又看到了,记录下来:

local funA = function(n)
    if n == 0 then
        return 1
    else
        return n+funA(n-1)
    end
end
print(funA(5))

例如上面的代码,我们想求1+2+3+ ... +n的和,定义了一个函数funA,在funA递归调用自己。
我们运行是会发现报错。

lua: FunctionTest.lua:5: attempt to call global 'funA' (a nil value)

funA是个nil值,也就是我们没有定义。
这是因为Lua我们的局部函数funA还没有定义完,因此我们想要调用那么就是个nil,如果这是有个全局的函数funA,那么他会调用全局的那个funA。而非我们想要调用的局部函数funA,如下:

function funA(n)
    print("我是全局的funA")
    return 1
end

local funA = function(n)
    if n == 0 then
        return 1
    else
        return n+funA(n-1)
    end
end
print(funA(5))

输出:
[[--
    我是全局的funA
    6
    [Finished in 0.0s]
--]]

对于这个问题我们可以先定义一个局部变量,然后在定义行数本身。如下:

function funB(n)
    print("我是全局的funB")
    return 1
end

local funB
funB = function(n)
    if n == 0 then
        return 0
    else
        return n+funB(n-1)
    end
end
print(funB(5))

输出:
[[--
    15
    [Finished in 0.0s]
--]]

现在函数funB中调用的就是局部函数funB了。即使在函数定义的时候,这个局部变量的值还有完成定义,但之后函数执行的时候,funB就已经有了正确的值了。
其实通常我们在写过的过程中我们是这样写的:

function funC(n)
    print("我是全局的funC")
    return 1
end

local function funC(n)
    if n == 0 then
        return 0
    else
        return n+funC(n-1)
    end
end
print(funC(5))

输出:
[[--
    15
    [Finished in 0.0s]
--]]
这样写在Lua内部也会把其展开成:
local funC
funC  =  function() --todo end