Lua - 为多个变量设置默认值

Lua - Set default value for multiple variables

是否可以在Lua中为多个变量设置默认值?我似乎很难做到这一点。

我的逻辑: 1) 可以像这样为多个变量设置值:

> one, two = "uno", "dos"
> print(one)
uno
> print(two)
dos

2) 可以像这样为变量设置默认值:

> foo = string.match("/dir/example.txt", "dir/(..)/.*") or "ab"
> return print(foo)
ab

3) 当我尝试为多个变量设置默认值时,我 运行 遇到了一个问题:

> foo, bar = string.match("/dir/xx/xx/example.txt", "/dir/(..)/(..)/.*") 
> print(foo)
xx
> print(bar)
zz

> foo, bar = string.match("/dir/xx/xx/example.txt", "/dir/(..)/(..)/.*") or "ab","cd"
> print(foo)
xx
> print(bar)
cd

我怀疑正在发生的事情是它将最后一个逗号之前的所有内容都视为 'foo' 的值,并将其之后的所有内容视为 'bar' 的值。

使用这个例子,是否可以表明如果 string.match 没有提供值,这些应该是默认值?

在这种情况下,您最好的选择就是执行以下操作:

foo, bar = someoperation()
foo = foo or defaultfoo
bar = bar or defaultbar
print(foo)
print(bar)

在解决您面临的问题之前,让我们解释一下情况 1 和情况 2 中发生的情况

  1. 您正在将多个值设置为多个值。这是 Lua 提供的语法糖,每个变量都用逗号分隔,每个值也是如此

  2. 您正在设置 "default" 值。您实际上并没有在这里提供默认值,只是使用逻辑操作来执行具有相同输出的任务。当您使用 or 命令时,您传递 2 个操作数,您要设置的值,如果第一个不存在则为默认值。 唯一的 原因是 or returns 如果第一个参数为 nil 或 false,则为第二个参数。

现在我们已经解释完了,让我们进入问题本身。

a, b = str:match(pattern) or "y", "z"

Lua 并不像您想象的那样阅读。 Lua 看到那个逗号,本质上会想到

a = str:match(pattern) or "y"
b = "z"

因为我们就是这么说的。我们像 #1 中解释的那样分离了值 Lua 无法识别您想要分配什么匹配项 returns 或那 2 个值。

至于修复它...那么你有 2 个选择。您可以定期分配它:

a,b = str:match(pattern)
if not (a and b) then
    a,b = "y","z"
end

或者您可以使用表格

t = {str:match(pattern)}
a,b = t[1] or "y", t[2] or "z"

完全由你决定

如果我误解了你的问题,我深表歉意,如果我这样做了,请在评论中通知我