<Lua程序设计>读书笔记



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),一定数量就可能导致栈溢出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值