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
=+
。这同样适用于and
和not
。
你真的应该注意这一点。
我个人更喜欢||
运算符,因为它的语义很好理解,避免使用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:比较级之间有啥区别:“||”和“或” [重复]的主要内容,如果未能解决你的问题,请参考以下文章