在下面的代码中,有人可以解释b,a = a,b内部是如何工作的吗?
-- Variable definition:
local a, b
-- Initialization
a = 10
b = 30
print("value of a:", a)
print("value of b:", b)
-- Swapping of variables
b, a = a, b
print("value of a:", a)
print("value of b:", b)
答案 0 :(得分:10)
考虑Lua脚本:
local a, b
a = 10
b = 30
b, a = a, b
在其上运行luac -l
,您就会明白这一点:
1 [1] LOADNIL 0 1
2 [2] LOADK 0 -1 ; 10
3 [3] LOADK 1 -2 ; 30
4 [4] MOVE 2 0
5 [4] MOVE 0 1
6 [4] MOVE 1 2
7 [4] RETURN 0 1
这些是给定脚本的Lua VM的说明。局部变量分配给寄存器0和1,然后寄存器2用于交换,就像你手动使用临时变量一样。实际上,下面的Lua脚本生成完全相同的VM代码:
local a, b
a = 10
b = 30
local c=a; a=b; b=c
唯一的区别是,如果脚本更长,更复杂,编译器会在第一种情况下重用寄存器2。
答案 1 :(得分:1)
我认为在内部你并不意味着Lua C代码?
基本上,在多次分配中,Lua总是在执行分配之前评估分配右侧的所有表达式。
因此,如果您在分配的两侧使用变量,则可以确定:
local x, y = 5, 10
x, y = doSomeCalc(y), doSomeCalc(x) --x and y retain their original values for both operations, before the assignment is made