funtion(函数)
1.1 function(函数)是一种变量
和其他编程语言一样(c/c++),lua函数是完成某个功能并返回相应值的代码块,但lua中,函数和number、boolean以及table一样是一种变量,funtion可以赋值给变量、可以作为table的某个成员、也可以作为某个函数的的参数等,具体如下:
-- 函数功能: 比较两个数的大小
function compare(a, b)
return a < b
end
a. 赋值给变量
-- 将函数赋值给局部变量func
local func = compare
-- 利用局部变量调用函数
print(func(4, 5)) -- 结果为 true
b. 作为table的成员
-- 函数作为表temTab的成员
local tempTab = {}
tempTab.func = compare
-- 调用函数
print(tempTab.func(4, 5)) -- 结果为 true
c. 作为函数的参数
local list = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}
-- 作为函数参数
table.sort(list, compare)
for i = 1, #list do
print(list[i])
end
-- list顺序输出为: 1 2 3 4 5 6 7 8 9 10
1.2 可返回多个值或多种类型的值
a. 返回多个值
-- 数据表
local list = {1, 9, 8, 10, 6, 5, 9, 3, 2, 1}
-- 函数功能: 返回表中的最大值与最大值的key值
function maxinum(list)
assert("table" == type(list))
local nMax = 0
local nKey = 0
for k, val in pairs(list) do
if val > nMax then
nKey = k
nMax = val
end
end
return nMax, nKey
end
local maxNum, key = maxinum(list)
print(maxNum, key)
-- 结果输出为:10 4
b. 返回多种类型的值
lua函数的返回值可以是number、boolean、table、funtion中的任意一种,如函数maxinum的返回结果可以是一个表: return {max = nMax, key = nKey},
返回函数:return fun(x)
1.3. 函数可以是匿名的
local comp = function (a, b)
return a < b
end
print(comp(1, 2)) -- 结果为 true
1.4. 函数中可以再嵌套另一个函数
function add(a, b)
local sum = a + b
local function printSum()
print(sum)
end
return printSum()
end
add(1, 2) -- 结果为 3
闭包
2.1. 第一类值
第一类值指:在lua中函数和其他类型值一样(number、boolean、string、table),函数可以被存放在变量中,也可以存放在表中,可以作为函数的参数,还可以作为函数的返回值。
2.2. 词法定界
词法定界指:当一个函数内部嵌套另一个函数时,内部的函数可以访问外部函数的所有局部变量(外部函数中的局部变量就是闭包中所指的upvalue)。
2.3. 闭包
a. 闭包是一个函数加上它可以正确访问的upvalues;
function counter()
local i = 0
return function ()
i = i + 1
return i
end
end
-- 作用在局部变量i上的闭包nCount
local nCount = counter()
print(nCount()) -- 输出 1
print(nCount()) -- 输出 2
通常情况下,在第一个print(nCount())时,局部变量i的生命周期就应该结束了,但是lua用闭包思想作了正确的处理,局部变量i作为内嵌函数的upvalue保存了下来, 具体生命周期什么时候结束,由lua编译器决定。
b. 闭包主要指值(即upvalue),其中的函数仅仅是闭包的一个原型声明。
function counter()
local i = 0
return function ()
i = i + 1
return i
end
end
-- 作用在局部变量i上的闭包nCount
local nCount = counter()
print(nCount()) -- 输出 1
print(nCount()) -- 输出 2
-- 作用在局部变量i上的闭包nOtherCount
local nOtherCount = counter()
print(nOtherCount()) -- 输出 1
print(nCount()) -- 输出 3
nCount和nOtherCount是作用在局部变量i上的两个不同闭包。