如何在Lua中交换变量?

Pra*_*kar 4 lua

在下面的代码中,有人可以解释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.


W.B*_*.B. 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
Run Code Online (Sandbox Code Playgroud)

  • 你为什么不自己看看资源呢?它们是公开的。 (2认同)