5.2 关于变长函数
unpack()的使用
print(unpack({10,20,30})) -->10 20 30
多值恒定式(multi-value identity)函数
function showData( ... )
print("data = " , ...) --调用前线打印一下数据
return ...
end
6.1.首先Lua的函数是第一类值,可以作为变量保存
关于closure闭合函数
例如:
do
local oldOpen = io.open
io.open = function ( filename, mode )
print("new io.open")
return oldOpen(filename, mode)
end
end
建议改写一些接口例如io.open的片段放到do...end 形成沙盒模式,这就不会影响到其他也调用io.open的地方了
6.2 非全局函数(non-global function )
在递归调用中的使用:
local a --这里先定义了fact虽然在函数中局部变量a还没完成,但是在以后的函数调用中就可以生效
a = function ( x )
if x == 0 then
return 1
end
return x * a(x - 1)
end
另外: 用语法糖也是没问题的
function a( x )
if x == 0 then
return 1
end
return a*a(x - 1)
end
但是互相调用就不行了,必须要先定义了才能调用
6.3 正确的尾调用(proper tail call)
判断准则是:一个函数在调用完另一个函数之后,是否就无其他事情需要做了
正确的例子:
function f( x )
return g(x)
end
function f( x )
if x > 1 then
return g(x)
end
end
错误的例子:
return g(x) + 1 --必须要做了一次加法
return x or g(x) --必须调整一次返回值
return (g(x)) --必须调整一次返回值
如果没尾调用的话每次调用都会创建一个新的栈层(stack level),一定数量就可能导致栈溢出