2017-03-21 4 views
0

Arrayメソッドが奇妙な動作をしましたが、何らかの理由があるのでしょうか?それは私にはルビーのバグのようになります。配列メソッドの一貫性のない動作

Array(1) 
[1] 
Array('') 
[""] 
Array({}) 
[] # ??? 
Array(nil) 
[] # ??? 

私は配列にnilまたは{}を通過したとき、私は1つの要素を持つ配列を取得することが期待、その代わり、私は空の配列を得ました。空の文字列を渡すと、正しく(私の意見では)1つの要素を持つ配列が返されることに注意してください。誰もこの行動の背後にある論理を説明できますか?

私は期待して:

と一致するであろう
Array(nil) # => [nil] 
Array({}) # => [{}] 

Array('') # => [''] 

それとも別の合理的な行動は次のようになります。

と '一貫性' だろう
Array('') # => [] 

Array(nil) # => [] 
Array({}) # => [] 
+0

@DaveNewton私が期待していることを明示的に述べるように質問を更新しました – mkk

+1

ハッシュを受け取ったときに明確に定義された動作があるため、明示的には* * *一致しません。私は、あなたの「無関心」の一貫性の議論に同意しませんが、それは意見ではありません。 –

+0

'Array([])'と 'Array({})'は同じ動作をします。両方とも配列エスクのコンテナです。 – tadman

答えて

5

ハッシュの場合、その動作は明確に定義されています。ハッシュは、キーと値のペアに分割され、各ペアは「サブ」配列になります。空のハッシュにはキーと値のペアがないため、空の配列です。少しは意味をなさない。空のオブジェクトのための特別なケーシングは、最小の驚きの原則を破るだろう。

nilについては、いずれにせよ争う可能性があります。 nilは何もIMOではないので、空の配列が理にかなっています。

最終的に答えは.to_aryとが返ってくるからです。 nilの場合は、空の配列はnilの配列よりもnil -yだけ見つかるだろう。ハッシュについては、空でないハッシュを配列に変換する方法と一貫していなければならないと思います。

+0

更新を参照してください – mkk

+0

OPが望んでいたことを達成する方法について言及する価値はありますし、splat演算子 '[* value]'を賢明に使用することによって行うことができます '既に配列です。 – Hauleth

2

関数配列(x)は、次のロジックを使用してアレイxを変換しようと:x.to_ary

  • を使用して暗黙的に変換する

    1. 試行は、明示的にx.to_a
    2. を使用してそれを変換しよう
    3. [x]は

  • だから個々のオブジェクトは、それらがアレイに変換する方法のためのロジックを決定、すなわち、アレイの中に包むことによって、それを変換します。理由 Array('')[]の代わりに ['']であるという理由は、文字列にはruby 1.9以降の to_aryまたは to_aメソッドがありません。文字列を配列に変換する正規の方法がないため、この変更が行われたと私は考えています。行ごとに、文字で分割したいですか?

    関連する問題