在Ruby中,“&&”和“&”有什么区别?

4

最近,我在使用 && 和 & 来处理输入组合 0 & 1 时,在 Ruby 中观察到了非常有趣的结果。

请问有人可以解释一下以下输出与上述两个操作符的关系吗?以下内容是使用 Ruby 2.0.0-p451 实现的。

2.0.0-p451 :006 > 0 && 1
 => 1 


2.0.0-p451 :008 > 0 & 1
 => 0 

谢谢你。
6个回答

12

&& 是逻辑与运算符。当且仅当两个操作数都为真时,它将返回真值。而且它是懒惰的(也称为短路),这意味着它将在结果被完全确定后停止评估。(因此,由于两个操作数都需要为真,如果第一个操作数为假,您已经知道结果将为假,甚至不用评估第二个操作数。)它也不会只返回truefalse,而是返回决定结果的操作数。换句话说:如果a为假值,它将返回a,否则它将返回b

nil && (loop {})
# => nil
# Note: the infinite loop is *not* evaluated
# Note: the return value is nil, not false

true && nil
# => nil

true && 'Hello'
# => 'Hello'

& 简单地调用 & 方法。 它会执行对象想让它执行的任何操作:

def (weirdo = Object.new).&(other)
  puts 'Whoah, weird!'
  'Hello, ' + other
end

weirdo & 'World'
# Whoah, weird!
# => 'Hello, World'

一般而言,运算符 & 和它的兄弟 | 用于布尔运算中的与、或操作(分别对应TrueClass#&, FalseClass#&, NilClass#&, TrueClass#|, FalseClass#|, NilClass#|)。但是,&| 是标准方法调用,因此始终会计算它们的参数,并返回 truefalse 而不是参数本身。

对于集合类 Set&| 分别执行交集和并集操作:Set#&, Set#|。而对于其他集合类(特别是 Array),&| 还可以执行集合操作:Array#&, Array#|

对于整数类 Integer&| 分别执行按位与和按位或操作,其中二进制表示采用补码形式:Fixnum#&, Bignum#&, Fixnum#|, Bignum#|


非常感谢您提供的额外笔记,这些见解非常精彩。我给您点赞只是为了表达我对您花费时间记录这些内容的敬意。我也觉得 && 运算符很聪明,因为它知道何时在操作数方面切断 :). - boddhisattva

11

&&是一个布尔类型的and运算符。如果第一个参数为真值,它会返回第二个参数。因为在Ruby中,0被认为是真值,所以会返回第二个参数1

&是一个按位and运算符。它比较数值的二进制表示。因为(假设8位)000000000)和000000011)没有共同的1数字位,所以它返回000000000)。


你的回答更精确地回应了我的问题。谢谢。同时,这也让我想起了为什么下面的 Ruby 代码能够正常工作(输出“hi”)。p "hi" if 0 - boddhisattva

0

&& 是逻辑与。也就是说,如果 a 为真且 b 为真,则 a && b 返回 true。 & 是按位与。在(几乎)任何其他语言中,0 和 1 的逻辑与都将返回 0,因为(几乎)所有其他语言都认为 0 是 false。但在 Ruby 中,除了 nilfalse 之外的任何值都被视为 truthy。


0

当使用Fixnums时,&|是逻辑运算符,用于处理truefalse。而当使用Array和Set实例时,它们是集合运算符。 - mu is too short

0

这个页面很好地解释了Ruby中不同的运算符。

&&是Ruby中的逻辑AND运算符。

> a = true
> b = true
> c = false
> a && b
 => true 
> a && c
 => false 

&是Ruby中的按位AND运算符。根据维基百科对“按位AND运算符”的描述:

按位AND取两个等长的二进制表示,并对每对相应位执行逻辑AND操作。如果第一个位和第二个位都为1,则每个位置上的结果为1;否则,结果为0。


0

&& 是一个逻辑运算符,它将始终返回布尔值。 它只有在两个操作数都为 true 的情况下才会返回 true

true && true

如果任何值为false,则返回false

false && true

现在来到第二点&运算符。这是&运算符的两个答案。

& is a Bitwise operator as mentioned in above answers, It compares bit representation in the form of 0 and 1.

另一个重要的答案是,在升级 Ruby 2.6 时,其实现方式有所修改。

& 被表示为交集运算符

例如:

[1, 2, 3] & [2, 3, 4]
$ [2, 3]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接