Lua: 单行多变量声明的使用规则

Lua: Usage rules for the single line multiple variable declaration

   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

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

The above makes sense, why does the following addition of a comma create an error though

因为在Assignment section of the Lua manual, it expects explist on the right side, which is defined中描述为逗号分隔的表达式列表:nil | false | true | Numeral | LiteralString | ‘...’ | functiondef | prefixexp | tableconstructor | exp binop exp | unop exp。 None 其中允许包含语句(在您的情况下是 for 循环)。

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

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

local a, b = 33, (function()
  print("foo")
  return 34
end)()
print(b) -- will print `34`
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 循环不是表达式,而是语句。很明显,您不能在逗号分隔的表达式列表中间有语句。