從Section 4.1 of Programming in Lua。多重任務如何工作?
在多次賦值中,Lua首先評估所有值,然後只有 執行賦值。因此,我們可以使用多重分配 交換兩個值,如
X,Y = Y,X - 交換
x' for
Y」
如何分配工作的實際?
從Section 4.1 of Programming in Lua。多重任務如何工作?
在多次賦值中,Lua首先評估所有值,然後只有 執行賦值。因此,我們可以使用多重分配 交換兩個值,如
X,Y = Y,X - 交換
x' for
Y」
如何分配工作的實際?
如何實現多個賦值取決於你正在使用的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正用於x
和y
,並且插槽2正在用作臨時附加插槽。 x
和y
獲得前兩個操作碼,並在接下來的三個3個操作碼使用「臨時」第二槽進行交換與常數初始化,有點像你會做手工:
tmp = y -- MOVE 2 1
y = x -- MOVE 1 0
x = tmp -- MOVE 0 2
考慮如何的Lua在進行交換分配和靜態初始化時使用了不同的方法,如果對不同類型的多個分配有不同的結果,我不會感到驚訝(設置表字段可能會看起來非常不同,特別是從那時起訂單應該很重要由於metamethods ...)。我們需要找到源代碼中的字節碼發出的部分,但100%確定。正如我之前提到的,所有這些在Lua版本和實現之間可能會有所不同,特別是如果您查看LuaJIT vs PUC Lua。
你是什麼意思「實際工作」?該書*解釋了它是如何工作的。你還想找什麼? – 2013-03-06 20:08:27