lua支持非全局函数,常见的有在表中定义函数。在表中定义函数的方式有多种:
例如:
lib = {
foo = function (x,y)return x - y end
goo = function (x,y) return x + y end
}
lib = {}
lib.foo = function (x,y) return x - y end 或者 function lib.foo (x,y)
lib.goo = function (x,y) return x+y end return x - y
end
还有一种常见的非全局函数,就是直接加上 local 关键字
local foo = function (x , y) return x - y end
local function foo(x , y)
return x + y
end
非全局函数的递归函数需要注意!
local f
local function f(n)
if n = 0 then
return 1
else
return n*f(n - 1)
end
end
当lua调用递归的时候,是不知道 f(n) 这个函数是非全局的,所以会去全局函数中寻找有没有这样的函数。
为了避免这样的问题,需要在函数前,声明函数。
对于那种非直接递归的函数(1调用2,2再调用1).也需要先声明。
local f,g
local function f()
g()
end
local function g()
f()
end
lua可以正确的处理尾调用。
先来了解一下什么叫做尾调用。
function foo(n)
if n > 0 then
return f(n - 1)
end
end
当g函数的最后一个动作是在调用f函数,且f函数不需要返回到g函数的时候,就叫做尾调用。
function f()
g()
return 0
end
这样的情况就不是尾调用,而是一个正常的函数调用。
function f(n)
return n*g(n)
end
这种情况,也不是,f函数再调用完g函数之后,还需要和n进行计算。
那么正确的处理尾调用是什么呢?
当一个函数有一个尾调用,该函数不会再栈内保留调用函数的信息,这个样子就可以无限的尾调用,不会让栈溢出。