作者:小老特 | 来源:互联网 | 2022-12-06 18:56
我得到以下内容:
puts true or true and false
# >> true
而我也得到:
if true or true and false
puts "that's true!"
else
puts "that's false!"
end
# >> that's false!
为什么true or true and false
两者都true
和false
(像薛定谔的猫一样)?
1> mwp..:
它与优先权有关.puts true or true and false
实际上评估为(puts true) or (true and false)
[编辑:不完全.请参阅下面Todd的注释.],并if true or true and false
评估为if (true or (true and false))
.这是由于puts
(方法)和if
(语言关键字)相对于表达式的其他项的优先级.
=> false
当你评估时,你会在irb中看到puts true or true and false
(记住,那是(puts true) or (true and false)
)因为puts
输出true
和返回nil
,这是假的,导致(true and false)
接下来评估,返回false
.
这就是大多数Ruby指南推荐使用&&
而||
不是and
和or
布尔表达式的原因之一.按照您的预期puts true || true && false
评估puts (true || (true && false))
和if true || true && false
评估if (true || (true && false))
.
你的第一句话是错误的,这是可以理解的,因为布尔语句是非常模糊的.Ruby实际上根据Ripper返回的[S-tree](/sf/ask/17360801/)来评估它更接近`(puts(true)或true)和(false)`.但是,通过更高优先级的运算符和括号来减少歧义通常是一个很好的建议.