だから私は| 2つの配列をマージして一意の値を取得します。ルビパイプ演算子(nilと配列)
しかし、私はnil | ["foo", "bar"]
が["foo", "bar"]
の代わりにtrue
を返すことを知りました。
誰かがこの現象を説明できますか? Rubyのバージョンは2.2.1です。
だから私は| 2つの配列をマージして一意の値を取得します。ルビパイプ演算子(nilと配列)
しかし、私はnil | ["foo", "bar"]
が["foo", "bar"]
の代わりにtrue
を返すことを知りました。
誰かがこの現象を説明できますか? Rubyのバージョンは2.2.1です。
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"]
:この例では、さまざまな「正しいことを行う」
[*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
本当にすばやく詳細な回答です。ありがとうございます! Upvoted。 –