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

时间:2016-06-16 22:10:38

标签: lua default-value

是否可以在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没有提供值,是否可以指出这些是预期的默认值?

2 个答案:

答案 0 :(得分:3)

让我们解释案例1和案例2中发生的事情,然后再解决您面临的问题

  1. 您正在为多个值设置多个值。这是由Lua提供的语法糖,每个变量用逗号分隔,同样每个值

  2. 您正在设置“默认”值。您实际上并未在此处提供默认值,只是使用执行具有相同输出的任务的逻辑操作。当您使用or命令时,您传递2个操作数,您要设置的值,以及第一个不存在的默认值。如果第一个参数为nil或false,or返回第二个参数

  3. 现在我们已经解释了,让我们自己解决问题。

    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)