美文网首页
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函数调用报错

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

  • Lua_API lua_call & lua_callk

    开篇 今天来简单了解一下 Lua 的函数调用:lua_call。 解析 函数调用协议 void lua_call ...

  • tolua调用c#函数及变量

    比如说你要调用一个lua函数 但你想把自身传给lua函数让这个函数调用c# 类的其他函数以及变量 首先是调用lua...

  • Lua笔记--function

    Lua笔记--Function 函数定义 函数调用 省略括号 Lua函数调用其中有一个比较特别的地方:当函数只有一...

  • lua和c的初始

    lua和c的交互包括:c访问lua的变量、c访问lua的table、c调用lua的方法、lua调用c的函数 参考链...

  • Lua中的CAPI概述

    头文件lua.h: Lua提供的基础函数,包括创建Lua环境,调用Lua函数,读写Lua环境中的全局变量,以及注册...

  • lua函数调用

    Lua 中的函数调用的语法如下: functioncall ::= prefixexp args 函数调用时,第一...

  • Lua语言学习教程

    lua闭包 函数尾调用 迭代器

  • 鹅厂实习周记(三)之Lua 使用C函数生成的so动态链接库

    Lua是可以调用C函数的,将c函数生成so库就可以动态链接进lua中调用啦。但是觉得坑还是挺多的。主要原因: 生成...

  • Lua与C进行交互

    1 预备知识 1.1 接口函数 接口函数都是由Lua虚拟机提供的,供C程序调用的函数 lua.h里的所有函数都是以...

网友评论

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

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