lua5.1 到 5.3的一些经常会接触到的改动

本文概述了Lua从5.1到5.3版本中的一些关键变动,包括函数运行环境的调整,getfenv和setfenv的移除,module函数的废弃,垃圾回收机制的变化,以及table元表的__mode生效时机。5.3版本引入了整数类型,改变了浮点数的字符串表示,并移除了bit32库,同时table库和math库的接口有所更新。此外,函数的==比较不再适用,调试事件中引入了'tail call'。
lua5.1 到 5.3的一些经常会接触到的改动
lua的官方文档,每个版本都有一节叫做"Incompatibilities with the Previous Version",
那里面简要描述了lua在语法、语义层面,标准库层面,CAPI层面上的变化,但是并没有涉及到方方面面,
并且lua的很多细微调整并没有出现在文档中,不过一般不用到太复杂的机制都不用担心。


而下面基本都是来自于这个章节的内容。但是不包含CAPI部分


5.2导致的改变


函数运行环境的概念发生了变化;
getfenv,setfenv被移除,要设置一个函数的运行环境,可以使用_ENV变量(函数的第一个upvalue)或者通过标准库 load来调用函数。
module函数也被废弃。


主动调用垃圾回收器时,如果垃圾回收器已经被关闭,将不会重新开启垃圾回收器。
如果table的key被设置为弱引用, 被称为一种短命的table(ephemeron table),当key不在被引用,那么整个pair都会被移除,
需要特别指出的是,如果对key的引用只来自于它所对应的value,那么整个pair也都会被移除
将table元表的__mode修改后,要到下一次垃圾回收器开始工作时才会生效
弱引用只对大多数引用类型生效,比如对number类型和string类型设置为弱引用是无效的


调试事件,“tail return” 被移除,取而代之的事件是”tail call“,程序可以根绝这个来判断下一次”return“事件
并不匹配最近的所有”tail call“

Lua 标准库:
math库更新了接口,有去掉的,有新增的,使用时请参照对应的版本
loadstring废弃,使用load代替,当第一个参数是string类型时,即相当于以前的loadstring
table.maxn被移除(它本身实现就需要遍历整个lua表),如果要实现自己用lua实现
unpack函数被移动到table.unpack
package.loaders重命名为package.searchers


不可以对函数进行 == 判断




5.3导致的改变


内部新增了整数类型,整数类型与浮点类型的运算结果为浮点类型。所以在抒写代码时就要求更严谨。
浮点类型现在直接通过字符串连接符转换成字符串,一定会带有小数点和小数部分,比如tostring(1.0)
以前的版本是结果是“1”,现在是“1.0”,所以对浮点数的格式化请使用显示的format,比如.f%, .1f%, .2f%


引入了位操作符(这个没有出现在Incompatibilities with the Previous Versio章节)


Lua 标准库:
bit32(5.2加入)库被移除,如需要请使用第三方库
table库的功能函数都会遵从table的元表元方法机制  (个人认为这一点改动非常好)
移除了5.2引入的__ipairs元方法,ipairs方法遵从元表元方法访问机制
math库接口重构,请参照对应版本,引入了^做幂运算

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值