在lua
中,函数是一种第一类值,它们具有特定的词法域。lua
当中函数是一个值,他可以存在变量中(无论全局变量还是局部变量)或table
中,可以作为函数参数,可以作为返回值。
upvalue
词法域:当一个函数内嵌套另一个函数的时候,内函数可以访问外部函数的局部变量。这也意味着lua
完全可以包含“λ演算(Lambda Calculus)”。
这个特性在以下场景特别有用:匿名函数作为高阶函数的参数,用于table
遍历和模式匹配。
在lua
中,函数可以看作一个“值”,由一些表达式创建的。
1 | foo = function (x) return 2*x end |
举个例子:
1 | network = { |
这种用法叫匿名函数,在语句中显示出了极好的便捷性。
闭包(closure)
如果说C++
式的面向对象编程是把一组函数绑定到特定数据类型上的话,那么闭包可以说是把一组数据绑定到特定函数上。
闭包通过调用含有一个内部函数加上该外部函数持有的外部局部变量(upvalue)
的外部函数(就是工厂)产生的一个实例函数
闭包组成:外部函数+外部函数创建的upvalue
+内部函数(闭包函数)
Lua
中有闭包,函数是闭包一种特殊情况。
…
当一个变参函数被调用,对应…的参数将会收集到一个叫arg
的table
里。这种方式虽然很简单便捷,但是要把这些参数传给另一个函数,就需要解包这个table
。因为程序员经常将参数传递给另一个函数,Lua 5.1
允许…用于参数列表和赋值表达式的右值。这避免了没必要的创建arg table
。
No se fundó Roma en una hora.Del dichoal hecho hay mucho trecho.