概要
上記の 2 つの演算子に関する以下の出力を理解したいと思います。これは Ruby 2.0.0-p451 を使用して実装されています
2.0.0-p451 :006 > 0 && 1
=> 1
2.0.0-p451 :008 > 0 & 1
=> 0
解決策
&& は論理 AND 演算子です。それは真実になります、IFF 両方のオペランドは真実です。また、これは遅延 (別名ショートサーキット) なので、結果が完全に決定されるとすぐに評価を停止します。 (したがって、両方のオペランドが真である必要があるため、最初のオペランドが偽である場合、2 番目のオペランドを評価するまでもなく、結果が偽になることがすでにわかっています。) また、単に true または false を返すだけではなく、むしろ結果を決定するオペランドを返します。 IOW: a が false の場合は 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'
& は単純に and メソッドを呼び出します。オブジェクトが望むことは何でも実行します。
def (weirdo = Object.new).&(other)
puts 'Whoah, weird!'
'Hello, ' + other
end
weirdo & 'World'
# Whoah, weird!
# => 'Hello, World'
セットの場合、セットの交差とセットの結合 (Set#&、Set#|) が実行されます。他のコレクション (特に配列) の場合も、集合演算 (Array#&、Array#|) を実行します。
整数の場合、2 の補数のバイナリ表現 (Fixnum#&、Bignum#&、Fixnum#|、Bignum#|) のビットワイズ AND が実行されます。