在下面的代码中,有人可以解释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)
Run Code Online (Sandbox Code Playgroud)
lhf*_*lhf 10
考虑一下Lua脚本:
local a, b
a = 10
b = 30
b, a = a, b
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这些是给定脚本的Lua VM的说明.局部变量分配给寄存器0和1,然后寄存器2用于交换,就像你手动使用临时变量一样.实际上,下面的Lua脚本生成完全相同的VM代码:
local a, b
a = 10
b = 30
local c=a; a=b; b=c
Run Code Online (Sandbox Code Playgroud)
唯一的区别是如果脚本更长且更复杂,编译器将在第一种情况下重用寄存器2.
我认为你所说的内部并不是指 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
Run Code Online (Sandbox Code Playgroud)