在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
答案 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?,因为他们应该在这方面回答您的问题。 (简短的回答是or
和or
是语句级别的运算符,而and
和||
是表达式级别的。)
答案 1 :(得分:0)
符号比较运算符(||
和&&
)优先于赋值(=
),而&&
优先于||
。他们的英文版本并非如此。它们都具有相同的优先级,并且低于赋值运算符。