闭包
- 简单的说闭包是一个函数加上它可以正确访问的 upvalues。
- 技术上来讲,Lua中只有闭包而不存在函数,函数仅仅是闭包的一个原型声明(一种特殊的闭包)
function newCounter()
local i = 0
return function() -- anonymous function
i = i + 1
return i
end
end
c1 = newCounter()
print(c1()) --> 1
print(c1()) --> 2
匿名函数使用 upvalue i 保存他的计数,当我们调用匿名函数的时候 i 已经超出了作用范围,因为创建 i 的函newCounter 已经返回了。然而 Lua 用闭包的思想正确处理了这种情况。
如果我们再次调用 newCounter,将创建一个新的局部变量 i,因此我们得到了一个作用在新的变量 i 上的新闭包。
c2 = newCounter()
print(c2()) --> 1
print(c1()) --> 3
print(c2()) --> 2
c1、c2 是建立在同一个函数上,但作用在同一个局部变量的不同实例上的两个不同的闭包。
技术上来讲,Lua中只有闭包而不存在函数,函数仅仅是闭包的一个原型声明(一种特殊的闭包);尽管如此,在不会导致混淆的情况下我们继续使用术语”函数”代指闭包。
词法定界
- 函数可以访问它的外部函数的变量。这个特征是强大的,因为它可以实现很多强大的函数式编程的功能,可以使你的程序更为简短
- 当一个函数内部嵌套另一个函数定义时,内部的函数体可以访问外部的函数的局部变量,这种特征我们称作词法定界。
function sortbygrade (names, grades)
table.sort(names, function (n1, n2)
return grades[n1] > grades[n2] -- compare the grades
end)
end
例子中包含在 sortbygrade 函数内部的 sort 中的匿名函数可以访问 sortbygrade 的参数grades,在匿名函数内部 grades不是全局变量也不是局部变量,我们称作外部的局部变量(external local variable)或者 upvalue。(upvalue 意思有些误导,然而在 Lua 中他的存在有历史的根源,还有他比起 external local variable 简短)。
第一类值
- 在Lua中,函数是和其他类型的值有着同样功能的值,我们可以把它存储在变量中,赋值,并且作为参数和返回值
Lua中的函数:
Lua中的函数是含有 词法定界 的 第一类值 。
Lua中的函数是匿名的,在程序中实际使用的函数名只是承载这个函数的一个变量,我们可以用各种方式来承载函数
函数和其它所有值一样都是没有名字的, 即它们都没有名称.
function foo( x )
return 2*x
end
↑只是一种语法糖而已, 相当于一下代码的一种简化书写形式.
foo = function ( x )
return x*2
end
高阶函数:
- 一个函数接收另一个函数作为参数,如
table.sort
,我们称为 高阶函数 ,高阶函数是一个强大的编程系统,有很强的灵活性
table.sort(network, funciton(a, b)
return (a.name > b.name)
end)
参考阅读: lua学习笔记(6)–再说函数