2016-08-31 11 views
1

だから私は| 2つの配列をマージして一意の値を取得します。ルビパイプ演算子(nilと配列)

しかし、私はnil | ["foo", "bar"]["foo", "bar"]の代わりにtrueを返すことを知りました。

誰かがこの現象を説明できますか? Rubyのバージョンは2.2.1です。

答えて

3

nilは、例の受信者です。NilClass#|は、式の右側(引数)をブール値に強制します。式はnil | !!(["foo", "bar"])と等価であり、nilは常に偽であり、配列は決して偽ではないため、false | trueになります。常に0123が返されます。同じことは、右側の他の非falsey値についても同様です:

irb(main):001:0> nil|0 
=> true 
irb(main):002:0> nil|1 
=> true 
irb(main):003:0> nil|"foo" 
=> true 
irb(main):004:0> nil|true 
=> true 
irb(main):005:0> nil|false 
=> false 
irb(main):006:0> nil|nil 
=> false 
あなたは何をやっているやって続けることができますが、

受信機がnil可能性がある場合(または配列以外本当に何)それを配列に変換して、希望する動作をArray#|にする必要があります。 |

irb(main):001:0> [*nil] | ["foo", "bar"] 
=> ["foo", "bar"] 
irb(main):002:0> var = "foo" 
=> "foo" 
irb(main):003:0> [*var] | ["foo", "bar"] 
=> ["foo", "bar"] 
irb(main):004:0> var = ["bar"] 
=> ["bar"] 
irb(main):005:0> [*var] | ["foo", "bar"] 
=> ["bar", "foo"] 
irb(main):006:0> var = [] 
=> [] 
irb(main):007:0> [*var] | ["foo", "bar"] 
=> ["foo", "bar"] 
irb(main):008:0> var = nil 
=> nil 
irb(main):009:0> [*var] | ["foo", "bar"] 
=> ["foo", "bar"] 
+0

本当にすばやく詳細な回答です。ありがとうございます! Upvoted。 –

1

:この例では、さまざまな「正しいことを行う」

[*nil] | ["foo", "bar"] 

:幸いにも、Rubyでそれを行うには本当にきちんとして簡単な方法があります実際にはビット単位またはruby.Itであることは、整数ではなく全体numbers.Itのバイト列として扱われることを意味することは、対応するビットの論理包含OR演算を要する

1|0 => 1 
1|1 => 1 
1|2 => 3 

ブール演算子の包みは||と同様です

true|false => true 
false|false => false 
nil|false => false 

偽| OBJ => trueまたはfalse はnil | OBJ => trueまたはfalse。結局のところnilclassは、ドキュメントを見つけるしなさいビット単位または論理的またはまたはが、配列の組合でもない配列の場合には

http://ruby-doc.org/core-2.0.0/NilClass.html#method-i-7C

が上書きされます。 http://docs.ruby-lang.org/en/2.0.0/Array.html