8
function tell(num,...)
    print("value of implicit table:",arg)
    --print("value of implicit table:",...)
    select(1,arg)
    --select(1,...)
end
tell(12,43,12,55)

式で を使用...すると、 の値がorなどarg
なるのはなぜですか?nilprint("value of implicit table:",...)select(1,...)

4

1 に答える 1

14

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

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

これの結論は、 が定義されている場合、本体でLUA_COMPAT_VARARG使用しない vararg 関数は引数リストを含む を取得し、vararg 関数はを含む を取得するということです。このバグは 5.1 のすべてのバージョンに存在し、特に、コンパイル時に定義されている場合、任意の varargs 関数から名前が付けられたグローバルまたはアップバリューにアクセスできないことを意味します。...local arglocal argnilargLUA_COMPAT_VARARG

Lua 5.2 ではarg-style varargs のサポートが完全に廃止されたため、コンパイル時の構成方法に関係なく、この問題は発生しません。

(出典: 5.0 と 5.1 の間の varargs 処理の変更とLUA_COMPAT_VARARGオプションは、Lua 5.1 リファレンス マニュアルのセクション 7.1 に記載されています。マニュアルではluaconf.hを参照しています。私が知る限り、正確な動作はどこにも文書化されていません。これは、 lparser.cおよびldo.cを読むか、この問題を最初に報告したメーリング リストの投稿から、実験的に判断できます。)

于 2013-09-08T00:36:57.170 に答える