Ruby 布尔运算

Ruby Boolean Operations

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

(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

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

either x and y to be true or just a

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

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

|||(以及 &&&)与 Ruby 中布尔值的主要区别在于 | 是布尔值 类 上的方法,而 || 是语言级布尔运算符。这意味着 || 支持短路评估,而 | 不支持。此外,|& 都比 &&|| 具有更高的优先级(其中 & 具有最高优先级),如 false && false | true #=> falsetrue | false & false #=> true.

像现在这样进行布尔运算时,||&& 几乎总是您想要的。

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