【问题标题】:How does swapping of variable works in Lua?在 Lua 中如何交换变量?
【发布时间】:2014-04-11 07:32:24
【问题描述】:

在下面的代码中,谁能解释一下 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)

【问题讨论】:

标签: lua


【解决方案1】:

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 您为什么不自己查看源代码?它们是公开的。
    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多