# 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`](#pdf-ipairs) 这个迭代器也会考虑元方法,而 `__ipairs` 元方法被废弃了。
* [`io.read`](#pdf-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`](#pdf-require) 在搜索 C 加载器时处理版本号的方式有所变化。 现在,版本号应该跟在模块名后(其它大多数工具都是这样干的)。 出于兼容性考虑,如果使用新格式找不到加载器的话,搜索器依然会尝试旧格式。 (Lua 5.2 已经是这样处理了,但是并没有写在文档里。)`
`
## 8.3 – API 的变更
* 延续函数现在接收原来用 `lua_getctx` 获取的参数, 所以 `lua_getctx` 就去掉了。 按需要改写你的代码。
* 函数 [`lua_dump`](#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) 加一个类型转换就可以替代 (或是只要有可能,就在你的代码中使用 [`lua_Integer`](#lua_Integer))。