在 Lua 中,变量交换是如何工作的?

在下面的代码中,有人可以解释一下 b,a = a,b 内部是如何工作的吗?

- 变量定义:
本地a,b
- 初始化
a = 10
b = 30

print(“a的值:”,a)

print(“b的值:”,b)

- 变量交换
b,a = a,b
print(“a的值:”,a)

print(“b的值:”,b)
点赞
用户2198692
用户2198692

我假设你说的 "internally" 不是指 Lua C 代码?

基本上,Lua 在多重赋值时,总是在执行赋值操作之前先 全部 计算右侧的表达式。

因此,如果你在赋值的两侧使用同一个变量,你可以确定:

local x, y = 5, 10

x, y = doSomeCalc(y), doSomeCalc(x) --在执行赋值之前,x 和 y 保留它们的原始值,分别计算 doSomeCalc(y) 和 doSomeCalc(x) 然后再进行赋值操作。
2014-04-11 07:43:53
用户107090
用户107090

考虑 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。

2014-04-11 11:15:35