Ruby:比较级之间有啥区别:“||”和“或” [重复]

Posted

技术标签:

【中文标题】Ruby:比较级之间有啥区别:“||”和“或” [重复]【英文标题】:Ruby: what is the difference between the comparatives: "||" and "or" [duplicate]Ruby:比较级之间有什么区别:“||”和“或” [重复] 【发布时间】:2011-01-23 11:58:10 【问题描述】:

可能重复: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,那么就会出现一个标志。使用带有变量列表的第二个示例,其中只有一个需要为真才能继续执行所需的代码。

这些假设正确吗?

【问题讨论】:

***.Com/questions/2083112 和 ***.Com/questions/1625946 的完全相同的副本。语义上等同于***.Com/questions/1426826 和***.Com/questions/1840488。也(有点)在***.Com/questions/1434842 中回答。严重地?在过去的 6 周里,Ruby 语言发生了哪些惊天动地的变化,同样的问题需要一遍又一遍地回答? @Jörg:我希望 SO 常客知道以前有人问过这个问题,但我对新手无法通过谷歌搜索相关问题并不感到惊讶。 【参考方案1】:

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

这是错误的句子

因此,您的假设不正确。

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 更友好(请参阅我的代码示例),但即使在微不足道的情况下,它也是错误的来源。

【讨论】:

你的回答比我的好很多!我会为非红宝石爱好者(和非 perl..ers?)添加 or 主要用于以下情况:x = get_some_string or ""。在这种情况下,get_some_string 可以返回 nil 或其他“假”值,x 将成为空字符串。不过,正如 Dmitriy 所说,|| 在这里也能很好地工作,这只是您在 ruby​​ 世界中偶尔会看到的一种约定(可能这是 perl 的继承)。 @thenduks: "x 会变成空字符串" 不,不会。如果您使用x = nil or "",x 将是nil,而不是"""" 将只是表达式的返回值。 嗯,非常正确,=or 绑定得更紧...那么我的例子很糟糕。【参考方案2】:

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

【讨论】:

他们不会做同样的事情,因为相同的代码块会呈现不同的输出。 低优先级是什么意思? Precedence 定义了操作的顺序。例如,* 的优先级高于+,因此表达式1 + 2 * 3 返回7,因为先进行乘法运算。【参考方案3】:

您对示例的结论不正确。

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

此代码输出“某事”,因为这就是“逻辑或”运算的工作方式。它读起来像“如果条件 1 或条件 2 或条件 3 中的至少一个为真......”。

第二个例子完全一样,只是因为rules of precedence in Ruby。

【讨论】:

以上是关于Ruby:比较级之间有啥区别:“||”和“或” [重复]的主要内容,如果未能解决你的问题,请参考以下文章

“私有”、“公共”和“受保护的方法”之间有啥区别?

在 WebGL 中,属性、统一和可变变量之间有啥区别?

ri 和 rdoc 有啥区别

ruby - uniq 有啥区别!和 uniq [重复]

Ruby 中的“包含模块”和“扩展模块”有啥区别? [复制]

Ruby 中的方法和消息有啥区别? [关闭]