# 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))。