标签:
1. Lua中的函数和其他值一样都是匿名的,其实函数就是值,而函数名就是一个持有某函数的变量。
function foo() print("foo") end
等价于
foo = function (x) print("foo") end
可以将 function (x) <body> end 看做是函数的构造式,称为匿名函数
2.高阶函数:接收其他函数作为实参的函数
function foo(f, delta) delta = delta or 1e-4; return function (x) return function() return (f(x+delta) - f(x)) / delta; end end end local c = foo(math.sin)(30)(); --可以看见return的function 越深,需要()越多 print(math.cos(30), c);
3.闭合函数(closure):一个closure就是一个函数加上该函数所需访问的所有“非局部的变量(upvalue)”(函数是closure中的一种)
function foo() local i = 0; return function() i = i + 1; return i; end end print(foo()(), foo()()); --1 1 local f1 = foo(); local f2 = foo(); print(f1(), f2(), f1(), f1(), f2()); --1 1 2 3 2
可以看见,每次foo()都是一个新的closure,对于f1和f2,都是独立的closure。
在f1和f2中,就像是他们都有i这个域,一开始的 i = 0 在foo()这句话中已经执行了,后面每次执行的是 return function 这句话
4.多重返回值
function foo() local x = 10; local y = 23; return x, y; end a, b = foo(); --a = 10, b = 23;
多个返回值只发生在该函数式是一系列表达式中的最后一个元素,否则只返回第一个值(也可以使用圆括号来迫使返回一个值)
5.变长参数 (...)
6.具名实参:用table作为参数
7. 尾调用:调用函数foo后没有其他操作。尾调用不耗费任何栈空间。
正确的调用形式:return <func>(<args>)
不是尾调用的例子:
return g(x) + 1; return x or g(x) return (g(x)) --这个最容易忽略
常用地方:状态机,递归层次深的算法。
小知识点:(1)当参数只有一个时,无需写圆括号
(2)Coo:foo(x) 等价于 Coo:foo(x),冒号可以将Coo默认为第一个参数(常用在类的实现中)
(3)传入的实参少于形参,则少的以nil为值;若实参多于形参,则多余的舍弃(多重返回值也是同样的道理)
标签:
原文地址:http://www.cnblogs.com/programmer-kaima/p/4852193.html