Lua-If语句评估



如果我使用:

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的值如何,ored表达式都将是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

最新更新