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 会继续忽略掉这个字符。
  • 数学库中的这些函数废弃了:atan2coshsinhtanhpowfrexp, 以及 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_pushunsignedlua_tounsignedlua_tounsignedxluaL_checkunsignedluaL_optunsigned) 都废弃了。 直接从有符号版做类型转换。
  • 处理输入非默认整数类型的宏 (luaL_checkintluaL_optintluaL_checklongluaL_optlong) 废弃掉了。 直接使用 lua_Integer 加一个类型转换就可以替代 (或是只要有可能,就在你的代码中使用 lua_Integer)。