Ruby中的or
和||
运算符之间有什么区别?或者只是偏好?
答案 0 :(得分:211)
这是运营商优先权的问题。
||
的优先级高于or
。
因此,在两者之间你有其他运算符,包括三元(? :
)和赋值(=
),所以你选择哪一个可以影响语句的结果。
这是ruby operator precedence table。
请参阅this question了解使用and
/ &&
。
另外,要注意可能发生的一些令人讨厌的事情:
a = false || true #=> true
a #=> true
a = false or true #=> true
a #=> false
前两个语句都评估为true
,但第二个语句评估为a
至false
,因为=
优先级低于||
但高于or
{{1}}。
答案 1 :(得分:72)
正如其他人已经解释的那样,仅的区别是优先级。但是,我想指出两者之间实际上存在两个差异:
and
,or
和not
的优先级低于&&
,||
和!
< / LI>
and
和or
具有相同的优先级,而&&
的更高优先级高于||
一般来说,避免使用and
,or
和not
并使用&&
,||
和{{1}是一种好方式而是。 (例如,Rails核心开发人员拒绝使用关键字表单而不是运算符表单的补丁。)
它们存在的原因不是布尔公式,而是控制流。他们通过Perl众所周知的!
习语进入Ruby,其中do_this or do_that
返回do_this
或false
如果有错误,只有 >而nil
执行了。 (类似地,还有do_that
成语。)
示例:
do_this and then_do_that
有时,这可以使控制流程比使用download_file_via_fast_connection or download_via_slow_connection
download_latest_currency_rates and store_them_in_the_cache
或if
更流畅。
很容易理解为什么在这种情况下操作符具有“错误的”(即相同的)优先级:它们永远不会在同一个表达式中一起出现。当他们做一起出现时,你通常希望他们只需从左到右进行评估。
答案 2 :(得分:38)
和/或用于控制流程。
Ruby不允许将此作为有效语法:
false || raise "Error"
然而这是有效的:
false or raise "Error"
您可以使用()进行第一项工作,但使用or
是正确的方法。
false || (raise "Error")
答案 3 :(得分:11)
puts false || true
- &gt;打印: false
Waypoint.refreshAll()
- &gt;打印: true
答案 4 :(得分:8)
我使用这些运算符的方式:
||, &&
用于布尔逻辑。 or, and
用于控制流程。 E.g。
do_smth if may_be || may_be
- 我们在这里评估条件
do_smth or do_smth_else
- 我们定义工作流程,相当于
do_smth_else unless do_smth
举一个简单的例子:
> puts "a" && "b"
b
> puts 'a' and 'b'
a
Rails中一个众所周知的习语是render and return
。这是说return if render
的捷径,而render && return
无法工作(请参阅Rails documentation)
答案 5 :(得分:2)
或与||
不同仅使用||运算符而不是或运算符。
理由:
答案 6 :(得分:1)
“或”和“||”如果任一操作数为true,则求值为true。只有当第一个操作数为false时,它们才会评估第二个操作数。
和“和”一样,“或”和“||”之间的唯一区别是他们的优先权。
只是为了让生活变得有趣,“和”和“或”具有相同的优先权,而“&amp;&amp;”优先级高于“||”。
答案 7 :(得分:-12)
只是添加到mopoke的答案,这也是语义问题。 or
被认为是一种很好的做法,因为它比||
读得更好。