最近,我在Ruby中观察到一个非常有趣的结果,同时使用了&&和&对于0和0的输入组合1.
有人可以就上面提到的两个运营商解释下面的输出吗?以下是使用Ruby 2.0.0-p451
实现的2.0.0-p451 :006 > 0 && 1
=> 1
2.0.0-p451 :008 > 0 & 1
=> 0
谢谢
答案 0 :(得分:8)
&&
是布尔 and
。如果第一个参数为true-ish,则返回第二个参数。因为0
在Ruby中是真的,所以返回1
。
&
是按位 and
。它比较值的位表示。因为(成像8位)00000000
(0
)和00000001
(1
)没有共同的1
位数,00000000
({{ 1}})返回。
答案 1 :(得分:7)
&&
是逻辑AND运算符。这将是真实的,IFF两个操作数都是真实的。它是懒惰的(又称短路),这意味着一旦结果完全确定它就会停止评估。 (因此,由于两个操作数都需要真实,如果第一个操作数是假的,你已经知道结果将是假的,甚至没有评估第二个操作数。)它也不会只返回true
或false
,而是返回确定结果的操作数。 IOW:如果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'
通常,&
及其兄弟|
应该执行连接和分离。因此,对于布尔值,他们执行AND和OR(TrueClass#&
,FalseClass#&
,NilClass#&
,TrueClass#|
,FalseClass#|
,NilClass#|
) &
和|
是标准方法调用的异常,因此总是评估他们的参数,并且他们总是返回true
或false
而不是他们的参数。
对于Set
,他们执行set intersection并设置union:Set#&
,Set#|
。对于其他集合(特别是Array
s),它们还执行集合操作:Array#&
,Array#|
。
对于Integer
,他们执行双补码二进制表示的BITWISE-AND:Fixnum#&
,Bignum#&
,Fixnum#|
,Bignum#|
。
答案 2 :(得分:0)
一个是布尔运算符,另一个是按位运算符:
# Bitwise operators
a = 78 # 01001110
b = 54 # 00110110
puts (a&b) # 00000110 = 6
puts (a|b) # 01111110 = 126
puts (a^b) # 01111000 = 120
puts (~a) # 10110001 = -79
puts (a<<2) # 00111000 = 312
puts (a>>2) # 00010011 = 19
http://www.public.traineronrails.com/courses/ruby/pages/008-rubyoperators.html
答案 3 :(得分:0)
This page给出了Ruby中不同运算符的一个很好的解释。
&&
是ruby中的逻辑AND运算符。
> a = true
> b = true
> c = false
> a && b
=> true
> a && c
=> false
&
是ruby中的bitwise AND运算符。根据维基百科关于“按位AND运算符”描述的文章:
按位AND采用两个相等长度的二进制表示 对每对相应位执行逻辑AND运算。 如果第一位为1,则每个位置的结果为1 位是1;否则,结果为0。
答案 4 :(得分:0)
&&
是合乎逻辑的。也就是说,如果a为真且b为真,则a && b
返回true。 &
是按位的。在(几乎)任何其他语言中,逻辑和0和1都是0,因为(几乎)所有其他语言都认为0是假的。但是在ruby中,除了nil和false之外的任何东西都被认为是假的。
答案 5 :(得分:0)
&& 是一个逻辑运算符,它将始终返回布尔值。
z
如果两个值均为true,则为 true
true && true
,如果任何值为false
,则将返回 falsefalse && 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]