如果我使用:
local a, b ,c
a = 1
b = 1
c = 1
if a == (b or c) then x end
我只会在b为真c未评估的情况下得到响应
如果我将其更改为
if (a == b or a == c) then x end
这可以正确评估b或c
p.s.我在Fibaro家庭中心3家庭自动化系统中使用这个Lua。
如果您想检查a是否等于b或c,这是正确的sytnax:
如果a==b或a==c,则结束
你的括号可以,但不是必需的。
在中
local a, b ,c
a = 1
b = 1
c = 1
if a == (b or c) then end
(b or c)
解析为b
,从而解析为if a == b then end
其原因称为短路评估。CCD_ 4是CCD_。因此,无论c
的值如何,or
ed表达式都将是true
。因此没有理由评估CCD_ 9。
发件人https://www.lua.org/manual/5.4/manual.html#3.4.5
和以及或都使用短路评估;也就是说,第二只有在必要时才计算操作数。以下是一些例子:
10 or 20 --> 10 10 or error() --> 10 nil or "a" --> "a" nil and 10 --> nil false and error() --> false false and nil --> false false or nil --> nil 10 and 20 --> 20
此处相同:
if a == b or a == c then end
如果a
等于b
,Lua将不检查a
是否等于c
。这并不太明显,但如果你有这样的东西:
local a = 1
function b() print("b") return 1 end
function c() print("c") return 1 end
if a == b() or a == c() then end
如果b
的返回值等于a
,Lua将不会调用c