为什么"真实或真实与虚假"似乎同时真实和错误?

Car*_*ine 4 ruby conditional-operator operator-precedence

我得到以下内容:

puts true or true and false
# >> true
Run Code Online (Sandbox Code Playgroud)

而我也得到:

if true or true and false
  puts "that's true!"
else
  puts "that's false!"
end
# >> that's false!
Run Code Online (Sandbox Code Playgroud)

为什么true or true and false两者都truefalse(像薛定谔的猫一样)?

mwp*_*mwp 7

它与优先权有关.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指南推荐使用&&||不是andor布尔表达式的原因之一.按照您的预期puts true || true && false评估puts (true || (true && false))if true || true && false评估if (true || (true && false)).

  • 你的第一句话是错误的,这是可以理解的,因为布尔语句是非常模糊的.Ruby实际上根据Ripper返回的[S-tree](/sf/answers/3639561271/)来评估它更接近`(puts(true)或true)和(false)`.但是,通过更高优先级的运算符和括号来减少歧义通常是一个很好的建议. (5认同)