function与闭包

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上的两个不同闭包。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值