加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

变量 – 多个赋值如何工作?

发布时间:2020-12-15 00:16:20 所属栏目:大数据 来源:网络整理
导读:从 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 in x,y = y,x — swap x' for 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 in

x,y = y,x — swap x' fory’

作业如何实际工作?

解决方法

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

如果您仍然对实际实现感到好奇,那么您可以做的一件事就是看看为某个程序生成的字节码是什么.例如,采取以下计划

local x,y = 10,11
x,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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读