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 #=> false
和 true | false & false #=> true
.
像现在这样进行布尔运算时,||
和 &&
几乎总是您想要的。
至于 ||
和 or
(或类似)之间的优先级差异,这个问题已经被问过好几次了。您可能想看看 Difference between "and" and && in Ruby? and Difference between "or" and || in Ruby?,因为他们应该在这方面回答您的问题。 (简短的回答是 or
和 and
是语句级运算符,而 ||
和 &&
是表达式级。)
在 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 #=> false
和 true | false & false #=> true
.
像现在这样进行布尔运算时,||
和 &&
几乎总是您想要的。
至于 ||
和 or
(或类似)之间的优先级差异,这个问题已经被问过好几次了。您可能想看看 Difference between "and" and && in Ruby? and Difference between "or" and || in Ruby?,因为他们应该在这方面回答您的问题。 (简短的回答是 or
和 and
是语句级运算符,而 ||
和 &&
是表达式级。)