Ruby:比较之间有什么区别:“||”和“或”

时间:2010-03-04 01:44:19

标签: ruby

  

可能重复:
  Ruby: difference between || and ‘or’

使用Ruby

||

or 

是非常常见的做法,因此很难知道两者之间的区别,不幸的是我不确定。

首先,我的问题是以下假设是否正确:

EX1:

if @variable_1 || @variable_2 || @variable_3 
  do something 
else
  do nothing
end

EX2:

if @variable_1 or @variable_2 or @variable_3
  do something 
else
  do nothing
end

所以在第一个例子中,如果任何变量为false,那么它将执行“什么都不做”

然而,对于第二个例子,检查所有变量,如果一个为真,那么它将执行“做某事”。

总结使用“||”如果你有一个需要检查的变量列表,如果其中一个返回false,那么一个标志会上升。将第二个示例与变量列表一起使用,其中只需要一个变量才能继续执行所需的代码。

这些假设是否正确?

3 个答案:

答案 0 :(得分:14)

  

或第二个例子检查所有变量,如果一个为真,那么它将执行“做某事”。

这是假判。

因此,您的假设不正确。

or||都做同样的事情。

主要区别在于or的优先级低于||。所以你应该注意更复杂的评估:

# Simple cases are not confusing
false || true # true
false or true # true

# This is more complex
a = false || true # a=true
a = false or true # a=false

# Also similarly as 1 + 2*3 returns 7, the following returns true:
false or false||true # true
# BUT! THIS IS IMPORTANT!
a = false or false||true   # a=false
a = (false or false||true) # a=true

以下是operators precedence的列表。

因此,如果您使用包含以下任何运算符的表达式,则会注意到真正的差异:

  • .. ... - 范围(包含和排除)
  • ? : - 三元if-then-else
  • = %= { /= -= += |= &= >>= <<= *= &&= ||= **= - 作业
  • defined? - 检查指定的符号是否已定义
  • not - 逻辑否定
  • and - 逻辑构成

也可能有其他人。

您可以了解+*之间的差异:|| == *or = + 。这同样适用于andnot

你应该注意这一点。

就我个人而言,我更喜欢||运算符,因为它的语义很好理解并且避免使用or

虽然感觉'or在许多情况下更友好(参见我的代码示例),即使是在琐碎的情况下,它也是错误的来源。

答案 1 :(得分:4)

他们做同样的事情,但or的优先级低于||(事实上,or的优先级低于大多数其他运营商。)

答案 2 :(得分:1)

您对这些示例的结论不正确。

if true || true || false
  puts 'something'
else
  puts 'nothing'
end

此代码输出'something',因为这是'logical或'操作的工作原理。它读起来像“如果条件1或条件2或条件3中的至少一个是真的......”。

第二个例子完全相同,但仅仅是因为rules of precedence in Ruby