【问题标题】:Lua - Set default value for multiple variablesLua - 为多个变量设置默认值
【发布时间】:2016-06-17 08:54:18
【问题描述】:

是否可以在 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 未提供值,是否可以指示这些应为默认值?

【问题讨论】:

    标签: lua default-value


    【解决方案1】:

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

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

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

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

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

    Lua 不像你想象的那样阅读。 Lua 看到那个逗号,本质上是在思考

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

    因为这就是我们所说的。我们像 #1 中解释的那样分隔了值,Lua 无法识别您要分配匹配返回的内容或这 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"
    

    这完全取决于你

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2022-06-30
        • 2014-03-12
        • 1970-01-01
        • 2018-10-18
        • 1970-01-01
        • 1970-01-01
        • 2017-01-02
        • 2011-07-31
        • 2017-01-16
        相关资源
        最近更新 更多