【问题标题】:Lua: Usage rules for the single line multiple variable declarationLua:单行多变量声明的使用规则
【发布时间】:2021-08-12 01:52:26
【问题描述】:
   local x,y=33,44

我不知道这种格式是指什么,如果有的话,我找不到任何关键字。分配本地 x=33;本地 y=44。有x的赋值不影响y的赋值的噱头,即

x=50
x,y=0,x --x=0,y=50
x=0 --x=0
y=x --y=0

太好了。该符号依赖于逗号来分隔第一个变量赋值的结束位置和第二个变量赋值的开始位置。我的困惑在于包含以下语句的案例:

local a,b=
    33 --a=33 b=nil
    for i=1,2 do
    a+=i --a=34,b=nil --a=3,b=34
    a,b=i,a --a=1,b=34 --a=2,b=3
    end

上面说得有道理,但是为什么下面添加逗号会产生错误:

local a,b=
    33 --a=33 b=nil
    for i=1,2 do
    a+=i --a=34,b=nil --a=3,b=34
    a,b=i,a --a=1,b=34 --a=2,b=3
    end,33

从我的角度来看,上面应该只是分配

a=      33 --a=33 b=nil
        for i=1,2 do
        a+=i --a=34,b=nil --a=3,b=34
        a,b=i,a --a=1,b=34 --a=2,b=3
        end
b=33

在像循环这样的条件中折腾之后似乎添加了逗号,不允许我将第二个变量分配给除了在第一个变量中定义它之外的任何东西?我不明白这里的逻辑。是否有规则说明这是为什么。我找不到信息。这里缺少关键字。

【问题讨论】:

    标签: lua variable-assignment


    【解决方案1】:

    上面说的有道理,为什么后面加逗号会报错

    因为如 Lua 手册的Assignment 部分所述,它期望右侧为explist,即defined 作为逗号分隔的表达式列表:nil | false | true | Numeral | LiteralString | ‘...’ | functiondef | prefixexp | tableconstructor | exp binop exp | unop exp。这些都不允许包含该语句(在您的情况下为 for 循环)。

    右侧只有33 的示例仍然有效,因为Lua 会将nil 分配给左侧没有右侧匹配的所有变量。

    如果你愿意,你可以指定任意复杂的东西,但你需要使用匿名函数并立即调用它,如下所示:

    local a, b = 33, (function()
      print("foo")
      return 34
    end)()
    print(b) -- will print `34`
    

    【讨论】:

      【解决方案2】:
      local a,b=
          33 --a=33 b=nil
          for i=1,2 do
          a+=i --a=34,b=nil --a=3,b=34
          a,b=i,a --a=1,b=34 --a=2,b=3
          end
      

      等价于

      local a, b = 33, nil
      for i=1,2 do
        a+=i
        a,b=i,a
      end
      

      这在语法上是正确的。因此没有错误消息。

      local a,b=
          33 --a=33 b=nil
          for i=1,2 do
          a+=i --a=34,b=nil --a=3,b=34
          a,b=i,a --a=1,b=34 --a=2,b=3
          end,33
      

      相当于

      local a,b= 33, nil
      for i=1,2 do
        a+=i
        a,b=i,a
      end
      ,33
      

      您不能在代码中隔离,33。那没有意义。因此出现错误。

      正如 Paul 已经解释过的,您只能分配以逗号分隔的表达式列表。 for 循环不是表达式,而是语句。很明显,在逗号分隔的表达式列表中间不能有语句。

      【讨论】:

      • 一种比我可以创建的算法本身使用上述格式更有效的算法。我不明白,想知道发生了什么。现在我知道了,我不会像他们那样写它。我不喜欢他们写东西的很多方式,但他们强调它被写成超级高效的事实......而且它就是这样运行的,所以我认为它可能有一些东西。第 56 行,我猜他们只是出于某种原因将 b 分配给 nil ......我不知道。 github.com/morgan3d/misc/blob/master/p8pathfinder/pathfinder.p8
      • 你为什么要发布这个?我看不出这与您的问题或我的回答有什么关系
      • "很明显,您不能在逗号分隔的表达式列表中间放置语句。"这是我发布上述内容的主要原因,否则我不会。
      • 如果您指的是line 56,他们将 nil 分配给第二个变量,然后运行 ​​for 循环。这不是你想要做的
      • 是的....但是他们为什么要将它分配给 nil。如果你以另一种方式看待它,它可能是 OP 的上述变量赋值。如果您查看代码的其他部分,它们会隐藏逗号所在的位置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 2019-02-25
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多