“或”和||之间的区别在Ruby?

时间:2010-01-17 23:36:51

标签: ruby operators

Ruby中的or||运算符之间有什么区别?或者只是偏好?

8 个答案:

答案 0 :(得分:211)

这是运营商优先权的问题。

||的优先级高于or

因此,在两者之间你有其他运算符,包括三元(? :)和赋值(=),所以你选择哪一个可以影响语句的结果。

这是ruby operator precedence table

请参阅this question了解使用and / &&

的其他示例

另外,要注意可能发生的一些令人讨厌的事情:

a = false || true  #=> true
a  #=> true

a = false or true  #=> true
a  #=> false

前两个语句都评估为true,但第二个语句评估为afalse,因为=优先级低于||但高于or {{1}}。

答案 1 :(得分:72)

正如其他人已经解释的那样,的区别是优先级。但是,我想指出两者之间实际上存在两个差异:

  1. andornot 的优先级低于&&||! < / LI>
  2. andor具有相同的优先级,而&&更高优先级高于||
  3. 一般来说,避免使用andornot并使用&&||和{{1}是一种好方式而是。 (例如,Rails核心开发人员拒绝使用关键字表单而不是运算符表单的补丁。)

    它们存在的原因不是布尔公式,而是控制流。他们通过Perl众所周知的!习语进入Ruby,其中do_this or do_that返回do_thisfalse如果有错误,只有 >而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)

或与||

不同
  

仅使用||运算符而不是运算符。

理由:

  • 运算符的优先级低于 ||
  • 的优先级低于=赋值运算符
  • 以及具有相同的优先级,而&amp;&amp; 的优先级高于 ||

答案 6 :(得分:1)

“或”和“||”如果任一操作数为true,则求值为true。只有当第一个操作数为false时,它们才会评估第二个操作数。

和“和”一样,“或”和“||”之间的唯一区别是他们的优先权。

只是为了让生活变得有趣,“和”和“或”具有相同的优先权,而“&amp;&amp;”优先级高于“||”。

答案 7 :(得分:-12)

只是添加到mopoke的答案,这也是语义问题。 or被认为是一种很好的做法,因为它比||读得更好。