首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >红宝石里的“或”和“”有什么区别?

红宝石里的“或”和“”有什么区别?
EN

Stack Overflow用户
提问于 2017-07-11 20:14:14
回答 2查看 572关注 0票数 3

我认为唯一的区别是|||之间的区别,其中|相当于or。但我意识到后者是不正确的,现在我很困惑。

:我理解这个问题与ruby按位或不同,而我的问题是缺乏对按位运算符和布尔运算符之间的区别的理解,正如这里在注释和答案中所指出的那样。此外,在我看来,这个问题的答案与问题本身更加相关和清晰。标记为重复将阻止用户获得更好的答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-11 20:30:29

|运算符是一个二进制数学运算符,即它做一个二进制或并在一个数值级别上工作:

代码语言:javascript
复制
1 | 2
# => 3
4 | 3
# => 7
1 | 2 | 3
# => 3

这是因为它在处理单个值,就好像它们是二进制的:

代码语言:javascript
复制
0b01 | 0b10
# => 3 (0b11)

||运算符是一个逻辑运算符,即它返回逻辑上为真的第一个值。在Ruby中,只有文本nilfalse值在逻辑上为false,其他一切,包括0、空字符串和数组,都是正确的。

所以:

代码语言:javascript
复制
1 || 2
# => 1
0 || 1
# => 0

or运算符的工作原理与||几乎完全一样,只是优先级要低得多。这意味着首先对其他操作符进行评估,如果您没有预料到这一点,这可能会导致一些问题:

代码语言:javascript
复制
a = false || true
# => true
a
# => true

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

这是因为它实际上被解释为:

代码语言:javascript
复制
(a = false) or true

这是因为=在被计算时有一个较高优先

票数 4
EN

Stack Overflow用户

发布于 2017-07-11 21:20:12

||or是一种特殊的内置运算符.这意味着他们可以(而且确实是这样)有不能用Ruby表达的行为。尤其是,||or在它们的右操作数中是非严格的和懒惰的,而or实际上是一种严格和热切的语言。

OTOH,|与任何其他方法调用一样,只是一个方法调用。这绝对没有什么特别之处。这意味着:

  • 这是严格的
  • 它是热切的
  • 任何对象都可以选择对它作出任何响应。

||or是语言内置运算符,它们是

  • 非严格的右操作数
  • 在他们的右操作数中懒惰
  • 它们的行为是硬编码的,与任何特定的对象无关,总是一样的,是不能改变的。

||or之间唯一的区别是优先级:or的优先级非常低(并且它具有与and相同的优先级)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45043727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档