8 – 与之前版本不兼容的地方
这里我们列出了把程序从 Lua 5.2 迁移到 Lua 5.3 会碰到的不兼容的地方。你可以在编译 Lua 时定义一些恰当的选项(参见文件 luaconf.h
),来回避一些不兼容性。然而,这些兼容选项以后会移除。
Lua 的版本更替总是会修改一些 C API 并涉及源代码的改变。例如一些常量的数字值,用宏来实现一些函数。因此,你不能假设在不同的 Lua 版本间可以做到二进制兼容。当你使用新版时,一定要将使用了 Lua API 的客户程序重新编译。
同样,Lua 版本更替还会改变预编译代码块的内部呈现方式;在不同的 Lua 版本间,预编译代码块不兼容。
官方发布版的标准路径也可能随版本变化。
8.1 – 语言的变更
Lua 5.2 到 Lua 5.3 最大的变化是引入了数字的整数子类型。虽然这个变化不会影响“一般”计算,但一些计算(主要是涉及溢出的)会得到不同的结果。 你可以通过把数字都强制转换为浮点数来消除差异(在 Lua 5.2 中,所有的数字都是浮点数)。比如你可以将所有的常量都以
.0
结尾,或是使用x = x + 0.0
来转换一个变量。(这条建议仅用于偶尔快速解决一些不兼容问题;这不是一条好的编程准则。好好写程序的话,你应该在需要使用浮点数的地方用浮点数,需要整数的地方用整数。)把浮点数转为字符串的地方,现在都对等于整数的浮点数加了
.0
后缀。(例如,浮点数 2.0 会被打印成2.0
,而不是2
。)如果你需要定制数字的格式,就必须显式的格式化它们。 (准确说这个不是兼容性问题,因为 Lua 并没有规定数字如何格式化成字符串,但一些程序假定遵循某种特别的格式。)分代垃圾收集器没有了。(它是 Lua 5.2 中的一个试验性特性。)
8.2 – 库的变更
bit32
库废弃了。使用一个外部兼容库很容易,不过最好直接用对应的位操作符来替换它。(注意bit32
只能针对 32 位整数运算,而标准 Lua 中的位操作可以用于 64 位整数。)- 表处理库现在在读写其中的元素时会考虑元方法。
ipairs
这个迭代器也会考虑元方法,而__ipairs
元方法被废弃了。io.read
的选项名不再用 '*
' 打头。但出于兼容性考虑,Lua 会继续忽略掉这个字符。- 数学库中的这些函数废弃了:
atan2
,cosh
,sinh
,tanh
,pow
,frexp
, 以及ldexp
。你可以用x^y
替换math.pow(x,y); 你可以用
math.atan
替换math.atan2
,前者现在可以接收一或两个参数; 你可以用x * 2.0^exp
替换math.ldexp(x,exp)
。 若用到其它操作,你可以写一个扩展库,或在 Lua 中实现它们。 require
在搜索 C 加载器时处理版本号的方式有所变化。 现在,版本号应该跟在模块名后(其它大多数工具都是这样干的)。 出于兼容性考虑,如果使用新格式找不到加载器的话,搜索器依然会尝试旧格式。 (Lua 5.2 已经是这样处理了,但是并没有写在文档里。)
8.3 – API 的变更
-
延续函数现在接收原来用
lua_getctx
获取的参数, 所以lua_getctx
就去掉了。 按需要改写你的代码。 -
函数
lua_dump
有了一个额外的参数strip
。 如果想和之前的行为一致,这个值传 0 。 -
用于传入传出无符号整数的函数
(
lua_pushunsigned
,lua_tounsigned
,lua_tounsignedx
,luaL_checkunsigned
,luaL_optunsigned
) 都废弃了。 直接从有符号版做类型转换。 -
处理输入非默认整数类型的宏
(
luaL_checkint
,luaL_optint
,luaL_checklong
,luaL_optlong
) 废弃掉了。 直接使用lua_Integer
加一个类型转换就可以替代 (或是只要有可能,就在你的代码中使用lua_Integer
)。