2013-09-08 3 views

答えて

14

Lua 5.1は、正式にはargテーブルの使用を非推奨にしています(...を推奨)。ただし、Lua自体のコンパイル時にはLUA_COMPAT_VARARGというオプションがあり、argを5.1コードで使用することができます。

のLUAがコンパイルされたときにLUA_COMPAT_VARARGが定義されていた場合、argテーブルは可変引数関数で作成され、引数が移入される - コンパイラは関数内...の使用を検出していない限り。その場合、5.0の代わりに5.1スタイルのvarargsを使用していると仮定し、テーブルを作成しません。 ですが、まだargという名前のローカルを作成します!

これの結論がLUA_COMPAT_VARARG場合が定義されていることで、体内で...を使用していない可変引数関数は、を行う引数リスト、および可変引数関数を含むlocal argnilを含むlocal argをゲット。このバグは、5.1のすべてのバージョンに存在し、特に、LUA_COMPAT_VARARGがコンパイル時に定義されている場合は、任意のvarargs関数からargという名前のグローバル値または上位値にアクセスできないことを意味します。

Luaは、完全にスタイルのvarargsをサポートしないため、コンパイル時にどのように構成されたかに関係なく、この問題は発生しません。

(出典:5.0と5.1の間で取扱い可変引数の変化、およびLUA_COMPAT_VARARGオプションは、the Lua 5.1 reference manual, section 7.1に記載されているマニュアルはluaconf.hにあなたを指し、正確な動作が限り私が知ってるように、どこにも記載されていません。実験的には、lparser.cldo.cを読むか、当初この問題を報告したメーリングリストの投稿から調べることができます)。

+0

これは興味深いことです。私はlua 5.2.0で試してみました。これは 'args'値として' table:00899618'(あなたが言ったことを確認します)です。 "コンパイル時"とは、luaインタプリタをコンパイルするとき、または 'luac.exe'を使ってluaスクリプトをコンパイルするときを意味します。どのようにしてそのような詳細を知ることができますか? – Segfault

+0

@Segfault彼は、インタープリタがソースからビルドされ、 '-DLUA_COMPAT_VARARG'のようなものがCコンパイラなどに提供されるときを意味します。 – greatwolf

+0

' -DLUA_COMPAT_ALL'はmakefileにあります。私は '_ALL'は' LUA_COMPAT_VARARG'が含まれていることを意味します。この情報はドキュメンテーションなどにありますか? – Segfault

関連する問題