是否可以在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没有提供值,是否可以指出这些是预期的默认值?
答案 0 :(得分:3)
让我们解释案例1和案例2中发生的事情,然后再解决您面临的问题
您正在为多个值设置多个值。这是由Lua提供的语法糖,每个变量用逗号分隔,同样每个值
您正在设置“默认”值。您实际上并未在此处提供默认值,只是使用执行具有相同输出的任务的逻辑操作。当您使用or
命令时,您传递2个操作数,您要设置的值,以及第一个不存在的默认值。如果第一个参数为nil或false,or
返回第二个参数
现在我们已经解释了,让我们自己解决问题。
a, b = str:match(pattern) or "y", "z"
Lua并不像你认为的那样读。 Lua看到逗号并且基本上认为
a = str:match(pattern) or "y"
b = "z"
因为这就是我们所说的。我们将#1中解释的值分开,Lua无法识别您想要分配哪些匹配返回或那两个值。
至于修理它...你有两个选择。您可以定期分配:
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"
这完全取决于你
如果我误解了你的问题我很抱歉,如果我这样做,请在评论中通知我
答案 1 :(得分:2)
在这种情况下你最好的选择就是做一些事情:
foo, bar = someoperation()
foo = foo or defaultfoo
bar = bar or defaultbar
print(foo)
print(bar)