美文网首页
Lua函数调用报错

Lua函数调用报错

作者: zzqlb | 来源:发表于2019-12-23 17:25 被阅读0次

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

    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
    

    相关文章

      网友评论

          本文标题:Lua函数调用报错

          本文链接:https://www.haomeiwen.com/subject/logznctx.html