当一个函数内部嵌套另一个函数的定义时,内部函数体可以访问外部的函数的局部变量,这种特征我们称为词法定界。
function newCounter()
local i = 0
return function()
i = i + 1
return i
end
end
c1 = newCounter()
print(c1())
print(c1())
print(c1())
非全局函数:
Lua中函数可以作为全局变量也可以作为局部变量,这时候需要注意函数和表语法:
--表和函数放在一起
Lib = {}
Lib.foo = function (x,y) return x + y end
Lib.goo = function (x,y) return x - y end
--使用表构造函数
Lib = {
foo = function(x,y) return x + y end ,
goo = function(x,y) return x - y end
}
--另外一种语法
Lib = {}
function Lib.foo(x,y)
return x + y
end
function Lib.goo(x,y)
return x - y
end
当我们将函数保存在一个局部变量内时,我们得到一个局部函数,也就是说局部函数想局部变量一样在一定范围内有效。
--方式1
local f = function (...)
...
end
local g = function(...)
...
f()
...
end
--方式2
local function f(...)
...
end
--声明递归局部函数的方式
local fact
fact = function(n)
if n == 0 then
return 1
else
return n * fact(n - 1)
end
end
--如果是直接递归调用也可以用下面的方式
local fact = function(n)
if n == 0 then
return 1
else
return n * fact(n - 1)
end
end
--如果是间接递归调用只能用以下的方式
local f,g
function g()
... f()...
end
function f()
...g()...
end
尾调用
尾调用时一种类似在函数结尾的goto调用,当函数最后一个动作是调用另外一个函数的时候,我们称这种调用尾调用。
迷宫代码:
function room1()
local move = io.read()
if move == "s" then
return room3()
elseif move == "e" then
return room2()
else
print("invalid move")
return room1()
end
end
function room2()
local move = io.read()
if move == "s" then
return room4()
elseif move == "w" then
return room1()
else
print("invalid move")
return room2()
end
end
function room3()
local move = io.read()
if move == "n" then
return room1()
elseif move == "e"
return room4()
else
print("invalid move")
return room3()
end
end
function room4()
print("congratilations!!!!")
end