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)
并不知道他是局部函数 fact
,Lua
会去查找是否有这样的全局函数 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函数之非全局函数的主要内容,如果未能解决你的问题,请参考以下文章