1. 当函数只有一个参数且该参数是字符串常量或表构造器时,括号是可选的:print "abc"
2. 函数参数的执行行为,举例:function f (a, b) print(a, b) end
f () --> nil nil
f(3) --> 3 nil
f(3, 4) --> 3 4
f(3, 4, 5) --> 3 4 ( 5被丢弃)
3. 函数默认函数写法,举例:调用incCount(),默认加1操作。
function incCount(n)
n = n or 1
globalCounter = globalCounter + n
end
4. 函数可变长参数...(可变长参数表达式),其行为类似于 一个具有多个返回值的函数。举例:
function foo ( ... )
local a,b,c = ...
当和固定参数混用,可变参数要放在固定参数之后。
5. 函数table.unpack与函数table.pack的功能相反。pack把参数列表转换成Lua语言中一个真实的列表(一个表),而unpack则把Lua语言中的
真实的列表(一个表)转换成一组返回值,进而可以作为另一个函数的参数被使用。例如:a,b = table.unpack{10,20,30} -- a=10, b=20, 30被丢弃
6. 尾调用不会使用栈空间,举例(正确的尾递归):支持任意数字作为参数,不会发生溢出。
function foo (n)
if n > 0 then return foo(n - 1) end
end
7. 尾调用判断:在调用之后是否进行其他工作。举例:
return g(x) + 1 -- 必须进行为口法 不是尾调用
return x or g(x) -- 必须把返回值限制为1个 不是尾调用
return (g(x)) -- 必须把返回值限制为1个 不是尾调用
return x[i].foo(x[j] +a*b, i + j) -- 在调用前对func及其参数求值 是尾调用
8. 两个功能强大的函数:os.execute 和 io.popen