local a = (true==true) and false or nil -- returns nil
local a = (true==true) and true or nil -- returns true
local a = (true==true) and not false or nil -- returns true
local a = (true==true) and not true or nil -- returns nil
当值为boolean
时返回正确的true
,但在false
时失败。为什么呢?
答案 0 :(得分:5)
布尔习语通过使用快捷方式评估(仅在必要时评估第二个操作数)。
如果您使用明确的优先级重写表达式,您可以看到为什么会得到nil
:
(true and false) or nil => false or nil => nil
(true and true) or nil => true or nil => true
(true and not false) or nil => true or nil => true
(true and not true) or nil => false or nil => nil
Logical Operators的Programming in Lua部分解释了这个成语:
另一个有用的习语是(a和b)或c(或简称a和b或c,因为它的优先级高于或者),这相当于C表达式
一个? b:c,前提是b不是假的。例如,我们可以使用类似
的语句选择最多两个数字x和ymax =(x> y)和x或y
为什么b
不能false
?因为评估将始终返回false
。
1 > 0 and false --> false
1 < 0 and false --> false