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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 7,876评论 2 9
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,733评论 0 38
  • 注:lua5.0以上版本去除了table.getn方法,可以用#tableName代替 函数有两种用途:1.完成指...
    _小圆球_阅读 3,793评论 1 1
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,793评论 1 32
  • 一、学习与实践 1.付出不亚于任何人的努力 2.要谦虚,不要骄傲 3.要每天反省 4.活着,就要感谢 5.积善行,...
    Lucien光阅读 1,202评论 0 1