2013-03-06 4 views
5

からSection 4.1 of Programming in Lua複数の割り当てはどのように機能しますか?

複数の割り当てでは、まずLuaがすべての値を評価し、 が割り当てを実行します。したがって、我々は

xのように、2つの値を交換するために、複数の割り当て を使用することができ、yはY、X = - スワップx' for Y」を

どう割り当て作業実際にいますか?

+1

「実際の仕事」とはどういう意味ですか?この本は*どのように動作するか説明した。あなたは何を探していますか? –

答えて

10

複数の割り当てがどのように実装されるかは、使用しているLuaの実装によって異なります。実装は、セマンティクスを保持している限り、好きなものを自由に実行できます。つまり、どのようなことが実装されても、LHSにLHSにすべての値を保存した場合と同じ結果が得られるはずです。


あなたはまだ、実際の実装について興味があれば、あなたが行うことができます一つのことは、特定のプログラム用に生成されますバイトコードであるかを確認です。例えば、以下のプログラム

local x,y = 10, 11 
x,y = y,x 

を取るとのLUA 5.2バイトコードコンパイラ(luac -l)に渡すこと(

main <lop.lua:0,0> (6 instructions at 0x9b36b50) 
0+ params, 3 slots, 1 upvalue, 2 locals, 2 constants, 0 functions 
    1 [1] LOADK  0 -1 ; 10 
    2 [1] LOADK  1 -2 ; 11 
    3 [2] MOVE  2 1 
    4 [2] MOVE  1 0 
    5 [2] MOVE  0 2 
    6 [2] RETURN  0 1 

MOVEオペコードが左レジスタに右のレジスタに値を割り当て与えます詳細については、Luaソースのlopcodes.hを参照してください)。明らかに、起こっていることは、レジスタ0と1がxyに使用され、スロット2が一時的な余分なスロットとして使用されているということです。 xyはあなたが手で行うだろう一種のように、最初の2つのオペコードにし、スワップは「一時的」、第2のスロットを使用して行われる次の3つの3オペコードに定数で初期化されます:

tmp = y -- MOVE 2 1 
y = x -- MOVE 1 0 
x = tmp -- MOVE 0 2 

はどのように考えるのLuaスワップ代入と静的初期化を行う際に別のアプローチを使用していましたが、異なる種類の複数代入に対して異なる結果が得られた場合は驚くことはありません(テーブルフィールドの設定はおそらく非常に異なって見えるでしょうメタメソッドのため...)。私たちは、バイトコードが100%確実に放出されるソースの部分を見つける必要があります。前にも触れましたが、Luaのバージョンと実装の間では、特にLuaJITとPUC Luaの違いがあります。

関連する問題