【问题标题】:lua multiple assignmentlua多重赋值
【发布时间】:2012-05-31 23:37:34
【问题描述】:

在 lua 中是否有任何多重赋值的方式,使得右侧的缺失值不被视为 nil ?

类似于

     a,b,c = 1

但得到

     a = 1, b = 1, c = 1

结果。

很遗憾,

    a = b = c = 1

没用。

我需要这个,因为我可能在右侧有复杂的表格,我想保持简短(没有任何额外的变量)。

【问题讨论】:

    标签: lua


    【解决方案1】:

    我希望这对你有用

    function push(n, value)
        if n <= 0 then
            return
        elseif n == 1 then
            return value
        else
            return value, push(n - 1, value)
        end
    end
    
    k, l, o, p = push(3, "foo")
    
    print(k)
    print(l)
    print(o)
    print(p)
    
    -- Output:
    -- foo
    -- foo
    -- foo
    -- nil
    

    【讨论】:

      【解决方案2】:

      不。

      你的第一个例子(多重赋值)已经有明确定义的语义,所以 Lua 需要一个加法运算符/关键字/东西来表示对不同语义的渴望(重复最后一个 r 值)。没有。

      您的第二个示例(将赋值链接在一起,ala C)要求赋值是表达式,而在 Lua 中它们是语句。


      你能得到的最接近的方法是定义一个将值多次推送到堆栈的函数:

      function push(x)
          return x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
      end
      

      那么你可以说:

      a,b,c,d,e,f,g = push(t)
      

      但这很笨拙。


      出于好奇,为什么您需要在同一个范围内对同一个表进行一堆不同的引用?

      【讨论】:

      • 我想调用一个 C 函数作为表格传递参数。例如,cfun({param1 = true, param2 = 1000, param3 = {subparam1 = {subsubparam1 = 0, subsubparam2 = 1, subsubparam3 = 0.5}, subparam2 = {subsubparam1 = 0, subsubparam2 = 1, subsubparam3 = 0.5}}} )
      • 一种解决方法是,在多个参数具有相同值的情况下,我允许使用其他写入方式:cfun({ param1 = true, param2 = 1000, param3 = { {subparams = {subparam1, subparam2}, {subsubparam1 = 0, subsubparam2 = 1, subsubparam3 = 0.5}}, {subparams = subparam3, {subsubparam1 = -10, subsubparam2 = 10, subsubparam3 = 5}} } })
      • 另一种可能需要多重分配的情况:local head=linkedlist(); local tail=head; tail=tail:push(val)。您希望两个变量开始指向同一个表,尽管稍后可能会更改。
      • 既然赋值是lua中的一条语句,那么如何实现这种类型的代码:?一些函数(arg1,arg2=otherfunc(),arg3)?这在许多地方可能很方便,但是将 arg2 发送到函数但首先更新它并在以后保持这种方式。有办法吗?
      【解决方案3】:

      你可以使用一个函数:

      local a,b,c = (function(t) return t,t,t; end)({1,2,3});
      

      不过,我更喜欢显而易见的解决方案:只需使用两行

      local a = {1,2,3};
      local b,c = a,a;
      

      【讨论】:

        【解决方案4】:

        不,这个 AFAIK 没有捷径。

        此外,无论如何,这可能不会像您希望的那样用于表值。

        local some_tbl = {a = 1, b = 2, c = 3}
        -- you just assigned the same table to both variables
        local a,b = some_tbl, some_tbl
        
        a.a = 5
        
        print(a.a, b.a)
        

        以上代码输出:

        >lua -e "io.stdout:setvbuf 'no'" "junk.lua" 
        5   5
        

        您刚刚更改了两个变量上表的 a 值(这可能不是您想要的,您可能希望为每个变量分配相同的表定义,但每个表包含不同的数据)。

        当我有代码处理同一表结构的单独副本时,我编写了一个 getter 函数来返回具有相同定义的新副本。如果在上面的代码中使用,它将如下所示:

        function get_TableLayout1()
            -- return separate copies of the same table layout
            return {a = 1, b = 2, c = 3}
        end
        
        local a,b = get_TableLayout1(), get_TableLayout1()
        
        a.a = 5
        
        print(a.a, b.a)
        

        打印出来的:

        >lua -e "io.stdout:setvbuf 'no'" "junk.lua" 
        5   1
        

        正如预期的那样。

        【讨论】:

        • 我不需要单独的副本,您提供的示例按我需要的方式工作。我只是不喜欢有额外的变量。
        猜你喜欢
        • 1970-01-01
        • 2021-12-13
        • 2013-03-20
        • 2011-03-12
        • 1970-01-01
        • 1970-01-01
        • 2021-03-30
        • 2016-03-05
        • 2011-07-08
        相关资源
        最近更新 更多