Ruby布尔运算

时间:2015-03-16 15:10:01

标签: ruby boolean-logic

在Rails中(所以,Ruby),我需要x和y为true或者只需要为true:

(x && y) || a

我怀疑我可以写

x && y || a

但我不知道Ruby的优先级是如何工作的。我做了一些测试,但我仍然不确定(尤其是第3行的异常):

true | true & false    # => true
true || true && false  # => true
true or true and false # => false #huh?

true | false & true    # => true
true || false && true  # => true
true or false and true # => true

奖励积分*表示|||or(以及and等价物之间的差异 - 我相信英文版本在Ruby样式指南中被禁止)。

但我的问题是如何在没有括号的情况下编写(x && y) || a

*奖励积分只是虚构的,因为@sawa(在下面的评论中)是秘密的Sheldon Cooper

2 个答案:

答案 0 :(得分:1)

  

要么x和y为真,要么只是

假设我理解正确,我会按照您在问题中的建议将其写为(x && y) || a。无论优先级如何,包括括号都会使其他人明白表达式的行为方式。

要回答你的问题,是的,你可以省略这种情况下的括号,正如测试用例false && false || true #=> true vs false && (false || true) => false所示,它表明&&的优先级至少是等于||的(优先级更高,如true || false && false #=> true所示)。

Ruby中布尔值的|||(以及类似地,&&&)之间的主要区别在于|是布尔类,而||是语言级布尔运算符。这意味着||支持短路评估,而|则不支持。此外,|&的优先级均高于&&||,(&具有最高优先级),如{{1}所示}和false && false | true #=> false

当您像现在这样进行布尔操作时,true | false & false #=> true||几乎总是您想要的。

至于&&||(或类似)之间的优先级差异,已经多次询问过这个问题。您可能需要查看Difference between "and" and && in Ruby?Difference between "or" and || in Ruby?,因为他们应该在这方面回答您的问题。 (简短的回答是oror是语句级别的运算符,而and||是表达式级别的。)

答案 1 :(得分:0)

符号比较运算符(||&&)优先于赋值(=),而&&优先于||。他们的英文版本并非如此。它们都具有相同的优先级,并且低于赋值运算符。