5.2 关于变长函数
unpack()的使用
print(unpack({10,20,30})) -->10 20 30
多值恒定式(multi-value identity)函数
function showData( ... )
print("data = " , ...) --调用前线打印一下数据
return ...
end6.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),一定数量就可能导致栈溢出
本文深入探讨Lua语言中变长函数、闭包及尾调用的使用方法,通过实例解析如何高效地利用这些特性进行编程。包括多值恒定式函数的实现、修改全局函数如`io.open`的沙盒模式、非全局函数的递归调用以及正确执行尾调用的准则。
1万+

被折叠的 条评论
为什么被折叠?



