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 Home Centre 3家庭自动化系统中使用此Lua

原文链接 https://stackoverflow.com/questions/70619275

点赞
stackoverflow用户2858170
stackoverflow用户2858170

如果您想检查 a 是否等于 b 或 c,则这是正确的语法:

如果 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

原因是短路求值。b1,因此是真值。因此,无论 c 的值如何,or 表达式都将为 true。因此不需要评估 c

来自https://www.lua.org/manual/5.4/manual.html#3.4.5

andor 都使用短路求值;也就是说,只在必要时才会评估第二个操作数。下面是一些示例:

 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

2022-01-07 09:42:06