【问题标题】:How does multiple assignment work?多重分配如何工作?
【发布时间】:2013-02-21 18:50:39
【问题描述】:

来自Section 4.1 of Programming in Lua

在多重赋值中,Lua 首先计算所有值,然后才计算 执行任务。因此,我们可以使用多重赋值 交换两个值,如

x, y = y, x -- 交换x' fory'

这项任务实际上是如何工作的?

【问题讨论】:

  • “实际工作”是什么意思?这本书解释了它是如何工作的。你还在寻找什么?

标签: variables lua variable-assignment


【解决方案1】:

如何实现多重赋值取决于您使用的 Lua 实现。只要保留语义,实现就可以随意做任何事情。也就是说,无论事情如何实现,您都应该得到相同的结果,就像在将它们分配给 LHS 之前将所有值保存在 RHS 中一样,正如 Lua 书所解释的那样。


如果您仍然对实际实现感到好奇,您可以做的一件事是查看为某个程序生成的字节码是什么。比如下面这个程序

local x,y = 10, 11
x,y = y,x

并将其传递给 Lua 5.2 的字节码编译器 (luac -l) 给出

main <lop.lua:0,0> (6 instructions at 0x9b36b50)
0+ params, 3 slots, 1 upvalue, 2 locals, 2 constants, 0 functions
    1   [1] LOADK       0 -1    ; 10
    2   [1] LOADK       1 -2    ; 11
    3   [2] MOVE        2 1
    4   [2] MOVE        1 0
    5   [2] MOVE        0 2
    6   [2] RETURN      0 1

MOVE 操作码将右侧寄存器中的值分配给左侧寄存器(有关详细信息,请参阅 Lua 源代码中的 lopcodes.h)。显然,正在发生的事情是寄存器 0 和 1 被用于xy,而插槽 2 被用作临时额外插槽。 xy 在前两个操作码中使用常量进行初始化,在接下来的三个 3 个操作码中,使用“临时”第二个插槽执行交换,有点像您手动执行的操作:

tmp = y -- MOVE 2 1
y = x   -- MOVE 1 0
x = tmp -- MOVE 0 2

考虑到 Lua 在进行交换赋值和静态初始化时如何使用不同的方法,如果您为不同类型的多重赋值得到不同的结果,我不会感到惊讶(设置表字段可能看起来非常不同,特别是从那时起,由于元方法,顺序应该很重要......)。我们需要在源代码中找到发出字节码的部分,以便 100% 确定。正如我之前提到的,所有这些都可能在 Lua 版本和实现之间有所不同,特别是如果您查看 LuaJIT 与 PUC Lua。

【讨论】:

    猜你喜欢
    • 2018-09-29
    • 2011-03-26
    • 2021-08-07
    • 2013-12-20
    • 1970-01-01
    • 2020-09-11
    • 2018-11-16
    • 1970-01-01
    • 2015-02-14
    相关资源
    最近更新 更多