2013-03-06 76 views
5

Section 4.1 of Programming in Lua多重任務如何工作?

在多次賦值中,Lua首先評估所有值,然後只有 執行賦值。因此,我們可以使用多重分配 交換兩個值,如

X,Y = Y,X - 交換x' for Y」

如何分配工作的實際?

+1

你是什麼意思「實際工作」?該書*解釋了它是如何工作的。你還想找什麼? – 2013-03-06 20:08:27

回答

10

如何實現多個賦值取決於你正在使用的Lua的實現。只要它保留了語義,該實現就可以自由地處理它喜歡的任何事情。也就是說,無論事情如何實現,您應該得到相同的結果,就像您在將RHS分配給LHS之前已經保存了RHS中的所有值一樣,正如Lua書中所解釋的那樣。


如果你還在好奇的實際應用中,有一兩件事你可以做的是看到什麼是獲取一定的程序產生的字節碼。例如,以下面的程序

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

並將它傳遞給字節碼編譯器(luac -l)爲lua 5.2給出

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獲得前兩個操作碼,並在接下來的三個3個操作碼使用「臨時」第二槽進行交換與常數初始化,有點像你會做手工:

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

考慮如何的Lua在進行交換分配和靜態初始化時使用了不同的方法,如果對不同類型的多個分配有不同的結果,我不會感到驚訝(設置表字段可能會看起來非常不同,特別是從那時起訂單應該很重要由於metamethods ...)。我們需要找到源代碼中的字節碼發出的部分,但100%確定。正如我之前提到的,所有這些在Lua版本和實現之間可能會有所不同,特別是如果您查看LuaJIT vs PUC Lua。