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 中发生的情况
您正在将多个值设置为多个值。这是 Lua 提供的语法糖,每个变量都用逗号分隔,每个值也是如此
您正在设置 "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"
完全由你决定
如果我误解了你的问题,我深表歉意,如果我这样做了,请在评论中通知我
是否可以在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 中发生的情况
您正在将多个值设置为多个值。这是 Lua 提供的语法糖,每个变量都用逗号分隔,每个值也是如此
您正在设置 "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"
完全由你决定
如果我误解了你的问题,我深表歉意,如果我这样做了,请在评论中通知我