8 以前のバージョンとの非互換性
Lua 5.3 のプログラムを Lua 5.4 に移植する際に遭遇する可能性のある非互換性をここに示します。
一部の非互換性は適切なオプションを使って Lua をコンパイルすることで回避できます (luaconf.h
を参照してください)。ただし、そういった互換性のためのオプションは将来削除されます。互換性オプションが削除されたときに互換性の問題が発生するということも少なくないので、機会を見計らって互換性オプションを全て無効にしたバージョンの Lua でコードをテストしておくべきです。そうしておけば新しいバージョンの Lua への移行がスムーズになります。
Lua はバージョン更新において C API を変更できます。これは定数が意味する数値やマクロとして実装される関数の内容など、ユーザープログラムのソースコードの変更が必要でない変更も含みます。そのため異なるバージョンの Lua で作ったバイナリに互換性があると考えては絶対にいけません。必ず新しいバージョンを使って Lua API のクライアントを再コンパイルしてください。
同様に Lua はバージョン更新においてコンパイル済みチャンクの内部表現を変更できます。そのためコンパイル済みチャンクは異なるバージョン間で互換性を持ちません。
公式ディストリビューションにおける標準パスはバージョン間で変わる可能性があります。
8.1 言語の非互換性
- 算術演算およびビットごとの演算における文字列から数値への変換は言語から削除されました。文字列ライブラリが算術演算におけるこの変換処理を文字列のメタメソッドとして提供します (ビット演算における変換処理は提供されません)。ただし、文字列ライブラリに追加されたこの新しい実装は以前のバージョンとは異なり文字列に含まれる数値定数の陰的な型を保存します。例えば Lua 5.4 における
"1" + "1"
は整数であり、浮動小数点数ではありません。 - 十進リテラルの整数がオーバーフローした場合には浮動小数点数として読まれます。以前の動作 (整数として読んでラップアラウンドする) は 16 進数を使う記法を使うと得られます。
__le
メタメソッドを__lt
メタメソッドを使ってエミュレートする機能は削除されました。必要な場合にはメタメソッドを明示的に設定してください。- 整数に対する数値を使った for 文の意味論の細かい部分が変更されました。具体的に言うと、制御変数がラップアラウンドしなくなりました。
goto
用のラベルの名前を現在見えているラベルと同名にすることはできません。現在のブロックの外側で定義されているラベルであっても見えているなら使うことはできません。- オブジェクトをファイナライズするとき、Lua は関数でない
__gc
メタメソッドを無視しません。何らかの値が設定されていれば、それが呼び出されます (__gc
が呼び出せない値のときは警告が発生します。この振る舞いはファイナライザにおける他のエラーと同様です)。
8.2 ライブラリの非互換性
-
print
関数は引数をフォーマットするときにtostring
を呼び出しません。代わりに似た機能がハードコードされます。出力を調整するには__tostring
を使ってください。 -
math.random
が使う疑似乱数生成器はランダム性が簡単に担保されたシードで初期化されるようになりました。また乱数生成アルゴリズムも変更されました。 -
utf8
ライブラリのデコード関数は、デフォルトではサロゲートペアを正当な符号位置として受理しません。デコード関数に追加の引数を渡すと許容するようにできます。 -
collectgarbage
関数の"setpause"
オプションと"setstepmul"
オプションは非推奨となりました。新しい"incremental"
オプションを使って値を設定してください。 -
io.lines
関数の返り値の数は一つから四つに変更されました。これにより省略可能なパラメータを持つ関数の唯一の引数としてio.lines
の呼び出しが使われているとき (例えばload(io.lines(filename, "L"))
) に問題が発生する可能性があります。この問題は関数の呼び出しを括弧で囲んで返り値の数を一つに調整すれば解決できます。
8.3 API の非互換性
- フルユーザーデータに任意個のユーザーバリューを関連付けられるようになりました。そのため
lua_newuserdata
,lua_setuservalue
,lua_getuservalue
は追加の引数の付いたlua_newuserdatauv
,lua_setiuservalue
,lua_getiuservalue
にそれぞれ置き換わりました。互換性のため、古い関数はユーザーバリューの個数を 1 としたマクロとして動作します。ただしユーザーバリューの個数を 0 とした方がメモリ的に効率が良いことに注意してください。
-
lua_resume
関数にパラメータが追加されました。これは出力用パラメータであり、コルーチンが yield または return してlua_resume
が返ったときにタックトップに存在する値の数を表します (以前のバージョンではスタック全体に値が置かれました)。 -
lua_version
はバージョン番号のアドレスではなくバージョン番号を返します。Lua コアは同じコアの静的コピーを個別に持つライブラリとも問題なく動作するので、同じアドレス空間を持っていることを確認する必要はありません。 - 定数
LUA_ERRGCMM
は削除されました。ファイナライザにおけるエラーは伝播されず、警告を発生させます。 -
lua_gc
関数のオプションLUA_GCSETPAUSE
とLUA_GCSETSTEPMUL
は非推奨となりました。LUA_GCINC
を使って値を設定してください。