多个变量如何在一个赋值语句中同时被赋值?
- 内容介绍
- 文章标签
- 相关推荐
本文共计528个文字,预计阅读时间需要3分钟。
从《Lua编程》第4.1节开始。在多重赋值中,Lua首先评估所有值,然后才执行赋值。因此,我们可以使用多重赋值来交换两个值,例如:x, y=y, x — 交换x和y的值
从 Section 4.1 of Programming in Lua起.In a multiple assignment, Lua first evaluates all values and only then
executes the assignments. Therefore, we can use a multiple assignment
to swap two values, as inx, y = y, x — swap
x' fory’
作业如何实际工作?
如何实现多个赋值取决于您正在使用的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用于x和y,而插槽2用作临时额外插槽. x和y在前两个操作码中使用常量初始化,在接下来的三个3操作码中使用“临时”第二个插槽执行交换,有点像你手工做的那样:
tmp = y -- MOVE 2 1 y = x -- MOVE 1 0 x = tmp -- MOVE 0 2
鉴于Lua在进行交换分配和静态初始化时如何使用不同的方法,如果您对不同类型的多个赋值有不同的结果,我不会感到惊讶(设置表字段可能会看起来非常不同,特别是从那时起由于metamethods,订单应该重要…).我们需要找到源代码中发出字节码的部分,尽管如此.正如我之前提到的,所有这些在Lua版本和实现之间可能会有所不同,特别是如果你看看LuaJIT和PUC Lua.
本文共计528个文字,预计阅读时间需要3分钟。
从《Lua编程》第4.1节开始。在多重赋值中,Lua首先评估所有值,然后才执行赋值。因此,我们可以使用多重赋值来交换两个值,例如:x, y=y, x — 交换x和y的值
从 Section 4.1 of Programming in Lua起.In a multiple assignment, Lua first evaluates all values and only then
executes the assignments. Therefore, we can use a multiple assignment
to swap two values, as inx, y = y, x — swap
x' fory’
作业如何实际工作?
如何实现多个赋值取决于您正在使用的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用于x和y,而插槽2用作临时额外插槽. x和y在前两个操作码中使用常量初始化,在接下来的三个3操作码中使用“临时”第二个插槽执行交换,有点像你手工做的那样:
tmp = y -- MOVE 2 1 y = x -- MOVE 1 0 x = tmp -- MOVE 0 2
鉴于Lua在进行交换分配和静态初始化时如何使用不同的方法,如果您对不同类型的多个赋值有不同的结果,我不会感到惊讶(设置表字段可能会看起来非常不同,特别是从那时起由于metamethods,订单应该重要…).我们需要找到源代码中发出字节码的部分,尽管如此.正如我之前提到的,所有这些在Lua版本和实现之间可能会有所不同,特别是如果你看看LuaJIT和PUC Lua.

