在 lua 中对具有多个 return 值的表达式使用逻辑运算符

Using logical operators with expressions with multiple return values in lua

我想做这样的事情:

s,e = string.find(str, pattern1) or string.find(str, pattern2)

(因为 lua 模式没有正则表达式 | 的等价物)

但是这给了我 nil e 即使其中一个模式匹配。

如何从第一个函数调用中获取两个 return 值来匹配?

Lua 列表是脆弱的,当用作非常特定上下文之外的表达式时(最重要的是,如果它们被分配给多个名称或作为函数的最后一个参数),它们会退化为它们第一个值。要获得所需的行为,您需要确保存储所有值。例如:

local s1, e1 = string.find(str, pattern1)
if s1 then
    s, e = s1, e1
else
    s, e = string.find(str, pattern2)
end

你的两个函数调用都不是表达式列表中唯一的也不是最后一个。因此,他们的 return 值列表调整为 1 个值。

https://www.lua.org/manual/5.4/manual.html#3.4

因此

s,e = string.find(str, pattern1) or string.find(str, pattern2)

或多或少等同于

do
  local v1 = string.find(str, pattern1)
  if v1 then
    s, e = v1, nil
  else
    local v2 = string.find(str, pattern2)
    if v2 then
      s, e = v2, nil
    else
     s, e = nil, nil
    end
  end
end

假设第一个模式匹配,那么 v1 是一个真值。 or 语句是 short-circuited 所以你赋值

s, e = v1, nil

如果第一个模式不匹配,则调用第二个 string.find。如果匹配,则 return 值为真值

s, e = nil or v2, nil

如果第一个模式不匹配,第二个不匹配你分配

s, e = nil, nil

您需要分别处理两个 string.find 调用,以免丢失任何 return 值。

local v1, v2 = string.find(str, pattern1)
if not v1 then
  v1, v2 = string.find(str, pattern2)
end
s, e = v1, v2