- lua 把 value 为 nil 的键值对视为不存在,
{ 1,2,nil,4 }
取长度时,到底是 2 还是 4 是未定义的。- 像 json 这种原本依赖语言, 有可能编码出
{ 1,2, null, 4 }
的数组。 - nil 放在 table 中有删除一个 slot 的语义,也影响了
__newindex
,__index
的行为。nil 和其它数据类型变得不一致,
- 像 json 这种原本依赖语言, 有可能编码出
-
5.0 到 5.1 , 可变参数的处理上, 从利用一个叫 arg 的 table 来传递可变参数,转到了现在的
...
- 这是在完善语言,可变参数是一个原本就具备的语言特性,需要对应的语法机制来对应。
- 如果用 arg 这样一个 table 绕一下,还会增加 gc 的负担。
...
的不便是,不能最为 upvalue
-
Lua 5.1 增强了模块化管理,建立起一套相对完善(同时也更复杂)的模块机制。
- Lua 5.1 到 Lua 5.2 的变化则是做减法。
- 环境这个概念被去除了,取而代之的是
_ENV
这个特殊的 upvalue 以语法糖的形式存在。 - 随着环境概念的消失,原本全局变量的概念其实也去掉了。
- 5.1 引入的复杂模块化机制也随着环境的取消而被完全删除,这套机制被看作是过度设计。
- 环境这个概念被去除了,取而代之的是
- 从完备性上考虑,5.2 增加了一组 C API ,重新实现了协程,终于去掉了 coroutine 在大部分官方库(尤其是 pcall/metamethod)中无法 yield 的限制(减少了使用特例)
- Lua 5.2 bit32 这个基础库被引入
- 在 5.2.0 到 5.2.1 的变更中,字符串被分裂为长字符串和短字符串两类 。
- 最大的改变是增加了 number 的子类型:整数的内部表达。 有了原生的 64bit 整数的支持。
- 由于有了整型的支持,逻辑位操作、移位操作、取模等都有了原生的支持。
- 通过对整型的支持,把文本串视为整数序列,支持 utf8 字符串也变成了官方支持。
- 另外,还整合了二进制数据块的打包解包模块 lpack 。
- 这些都可以看成是围绕整型支持的周边完善。而 C API 方面更是加强了整数在 C 和 Lua 间的交互能力。