在 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
我想做这样的事情:
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