Lua函数之非全局函数

Posted 森明帮大于黑虎帮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua函数之非全局函数相关的知识,希望对你有一定的参考价值。

Lua非全局函数

注意:在Lua中调用一个函数要在调用之前定义,否则出错。


local fact = function(n)
    if (n == 1) then
        return n;
    else
        return n + fact(n-1)
    end
end
print("result:", fact(2))

错误原因:

c:/Users/Administrator/.vscode/extensions/actboy168.lua-debug-1.59.0/runtime/win32-x64/lua54/lua.exe: d:\\vscode lua����\\hello world\\Untitled-1.lua:1807: attempt to call a nil value (global 'fact')
stack traceback:
	d:\\vscode lua����\\hello world\\Untitled-1.lua:1807: in local 'fact'
	d:\\vscode lua����\\hello world\\Untitled-1.lua:1810: in main chunk
	[C]: in ?

自己很纳闷,为什么会出现问题?看到报错,都会想到是没有识别,作用域的问题,结果参考[1],“上面这种方式导致Lua编译时遇到 fact(n-1) 并不知道他是局部函数 factLua会去查找是否有这样的全局函数 fact”,会有一个大概的了解。这里也给了一个解决办法:

local fLocal
fLocal = function(n)
    if (n == 1) then
        return n;
    else
        return n + fLocal(n-1)
    end
end
print("result:", fLocal(2))


分析一下,函数fact中是不能识别自己的,那么编译器在到这里的时候还不能认识fact。这让我想起来某个语言的定义(具体是什么忘记了):只有匹配到"",才算定义完毕,编译器才会识别这个定义。那是什么意思呢?拿这里的local fact来说只有编译器解释到“end”的时候才表示fact定义完毕,才会有这个变量,不然都是非法的,所以解决办法就是把fact单独拿出来,这样编译器扫描一遍的时候就认识了,不会报错。

Lua初识之非全局函数



-----表和函数放在一起
lib = 

lib.foo = function(x, y)
    return x + y
end

lib.goo = function( x, y)
    return x - y
end

print(lib.foo(3, 5))  -->  8
print(lib.goo(3, 5))  --> -2


--------------------------
--------使用表构造函数
lib = 
   foo = function(x, y) return x + y end,
   goo = function(x, y) return x - y end


print(lib.foo( 3, 5))  -->  8
print(lib.goo( 3, 5))  -->  -2


---------------------------
lib =

function lib.foo(x, y)
    return x + y
end

function lib.goo(x, y)
    return x - y
end

print(lib.foo(3, 5))  --> 8
print(lib.goo(3, 5))  --> -2


----------------------------
do
    local f = function(x)
        return x
    end 

    g = function(n) 
        return n * n
    end
   
    local gg = function(m)
        return f(m * m)
    end
 
    print(f(5))    --> 5
    print(g(6))    --> 36
    print(gg(8))   --> 64
end
    
print(g(9))  --> 81  
--print(f(5))  -->   在模块外调用局部函数 f()报错



------------------------------------
do
 
local function f(n)
    print(n * n)
end
    f(10)  -->  100
end
--f(10)  --> 局部函数在外部使用报错


---------------------------------
do

local fact
fact = function(n)
    if n == 0 then
        return 1
    else
    
    return n * fact(n - 1) 
    --> 此处用到了 fact() ,要提前声明 局部函数local fact,
    --> 不提前声明的话,会直接在全局函数中调用
    end   
    end
    print(fact(5))  -->  120
end



-------------------------
-----尾调函数
do  
 
function f(x)
     return g(x) --> 此种用法为尾调函数,即返回值调用 其他函数
end
    
function ff(x)
    g(x)
    return   --> 此种不属于尾调函数,
end
    
function g(n)
    return n
end

print(f(5))
end

以上是关于Lua函数之非全局函数的主要内容,如果未能解决你的问题,请参考以下文章

vue组件通信之非父子组件通信

我如何在不同的函数中访问全局变量我 lua

本地声明的 lua 函数是不是在每次传递时都会被解析?

lua的局部变量为什么要比全局变量快

在C函数中保存状态:registryreference和upvalues

quick lua 能用printf函数打印吗