"或"和||之间的区别 在Ruby?

Ale*_*sky 169 ruby operators

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

mop*_*oke 227

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

||优先级高于or.

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

这是一个ruby运算符优先级表.

有关使用/的其他示例,请参阅此问题.and&&

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

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

a = false or true  #=> true
a  #=> false
Run Code Online (Sandbox Code Playgroud)

无论是之前的两个语句的计算结果为true,但第二组afalse由于=优先级低于||比,但高or.

  • @cdosborn在评估为'true`时,`a`在表达式中被赋予`false`,这也是不直观的. (6认同)

Jör*_*tag 76

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

  1. and,ornot很多低于优先级&&,||!
  2. and并且or相同的优先级,同时&&具有较高的比优先级||

在一般情况下,它是很好的风格,以避免使用and,ornot与使用&&,||以及!代替.(例如,Rails核心开发人员拒绝使用关键字表单而不是运算符表单的补丁.)

它们存在的原因不是布尔公式,而是控制流.他们做了他们的方式进入红宝石通过Perl的著名do_this or do_that成语,其中do_this回报falsenil是否有错误,然后才进行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
Run Code Online (Sandbox Code Playgroud)

有时,这可以使控制流程比使用if或更流畅unless.

很容易理解为什么在这种情况下操作符具有"错误的"(即相同的)优先级:它们永远不会在同一个表达式中一起出现.而当他们出现在一起时,你通常希望他们进行评估只是左到右.

  • **不要**听@ MarnenLaibow-Koser - 这与可读性无关,而且与优先级差异在最基本的布尔运算中产生不同结果的事实有关:例如`true && false`! =`true和false`,`false或true`!=`false || TRUE`. (11认同)
  • 这偶尔会让我失望,因为在Perl中,`和`的优先级高于`或`,反映了`&&`和`||`.但通常你不应该把这些长而复杂的系列连在一起. (3认同)
  • 不.`和`总是比`&&`更好,除非做复杂的布尔代数.它更具可读性. (2认同)
  • 当您开始没有括号的嵌套操作时,@ Yarin Precedence只会成为一个问题.你的`true && false`的例子实际上基本上等同于'true和false`,因为没有优先级问题.同样,`(x> 1)和(x <4)`在操作上等同于`(x> 1)&&(x <4)`,因为所有优先级都是用parens完成的.在这些情况下,选择仅仅是可读性问题. (2认同)
  • @Yarin实际上,你的例子没有显示你认为它的作用.`true && false`相当于`true和false`.您的示例中的差异完全是由于隐式优先级问题:`print true和false`等同于'print(true)和false`,而`print true && false`等同于`print(true && false)`.你已经很好地证明了我的观点 - 当你遇到没有括号的操作时,优先权才会发挥作用. (2认同)
  • @Yarin 显然我在这里错了一半;看来 `print(true and false)` 是一个语法错误,我没有意识到这一点。 (2认同)

Ead*_*adz 39

和/或用于控制流程.

Ruby不允许将此作为​​有效语法:

false || raise "Error"
Run Code Online (Sandbox Code Playgroud)

但这是有效的:

false or raise "Error"
Run Code Online (Sandbox Code Playgroud)

您可以使用()进行第一项工作,但使用and正确的方法.

false || (raise "Error")
Run Code Online (Sandbox Code Playgroud)

  • 它是无效语法的事实是运算符优先级的结果.raise不会为此返回它不能被评估为表达式. (3认同)

小智 11

puts false or true- > print:false

puts false || true- > print:true


Vad*_*rov 9

我使用这些运算符的方式:

||, &&用于布尔逻辑.or, and用于控制流程.例如

do_smth if may_be || may_be - 我们在这里评估条件

do_smth or do_smth_else - 我们定义工作流程,相当于 do_smth_else unless do_smth

举一个简单的例子:

render and return

return if render

Rails中一个着名的成语是render && return.这是说话的捷径||, &&,虽然or, and不起作用(参见Rails 文档)