2011-03-30 11 views
8

ハッシュキーにアイテムを追加していました。Rubyハッシュのデフォルト値として配列を使用することはできませんか?

{ 
    'a' : [1], 
    'b' : [2, 3, 4] 
} 

私はハッシュを初期化するために配列を使いました。

irb> hash = Hash.new([]) 
=> {} 

は、次にそれを使用して開始しました:

irb> hash['a'] << 1 
=> [1] 
irb> hash['b'] << 2 
=> [1, 2] 

をしかし、それは結局のところ:

irb> hash 
=> {} 
+0

表示されている出力が不明ですか?ハッシュには実際に何が入っていますか?ここであなたが探しているものは不明です。 – jmccarthy

答えて

11

代わりに次の試してください:あなたはそのため=を使用する必要があなたの予期しない結果を得た

hash = Hash.new{|h, k| h[k] = []} 
hash['a'] << 1 # => [1] 
hash['b'] << 2 # => [2] 

理由を指定したということです空の配列をデフォルト値として使用しますが、同じ配列が使用されます。コピーは行われません。正しい方法は、私のコードのように新しい空の配列で値を初期化することです。

+0

+1 "空の配列をデフォルト値として指定しましたが、同じ配列が使用されています"。ビンゴ! –

+0

何ですか?これは本当に私にとっては奇妙です。文字列が再利用されていない文字列を使用する場合。文字列はある種の値型かもしれませんが、私はRubyでは "すべて"がオブジェクトだと思っていました。文字列と他のオブジェクトの違いはなぜですか? – Automatico

+0

@ Cort3z:あなたが何を意味するのか分かりません。たぶんこれは、違いがないことを示すのに役立ちます: 'a = b = 'foo'; a.replace 'bar'; bash => 'bar'' –

2

hash['a'] << 1hash['b'] << 2は、キー/値のペアを作成するための正しい構文ではありません。あなたのハッシュを与える必要があります

hash['a'] = [] 
hash['a'] << 1 

hash['b'] = [] 
hash['b'] << 2 

{'a' : [1], 'b' : [2]}

4

constructor[]は、未知のキーにアクセスするときに返されるデフォルト値として使用されました。 Array#<<はその受信機をに変更するので、これは最初は空の配列が大きくなります。

あなたがhash['a'] << 1を行うと、これは何が起こるかです::

  1. hash'a'
  2. という名前のキーが存在する場合それは、そこにあることを発見し確認するために見え、より詳細に説明するの

    そのような鍵はありません。

  3. 返されるデフォルト値が格納されているかどうかを調べます。
  4. Hash.new([])で構築したので、その値は[]であり、それを返します。
  5. 今度は[] << 1が評価され、これは、以前にエンカウントされていないキーが要求されたときに戻す値として、[1]を格納するようになりました。

何が欲しいの代わりにブロックして、コンストラクタの三番目の形式を使用して、キーと値のペアを保存する場合:

hash = Hash.new{|h, key| h[key] = []} 
1

これは、あなたが見ることを期待する正確動作です。

Hashには何も追加しないので、Hashは完全に空です。キーを検索すると、そのキーは決して存在しないので、指定したデフォルト値がArrayになります。

したがって、存在しない'a'というキーを検索すると、デフォルト値として指定したArrayが返されます。次に、Array<<と呼び出して、値(1)を追加します。

次に、あなたはまた、存在しないキー'b'を調べ、したがって、あなたは今、あなたが以前に追加された要素を1含まれているデフォルト値として指定Arrayを返します。次に、そのArray<<を呼び出し、値2を追加します。

Hashはまだ何も追加していないので、まだ空です。 Hashのデフォルト値は、値12を含む配列になりました。

出力は、評価された最後の式の結果を常に出力するためです。あなたの例の最後の式はArray<<です。 <<は受信者を返します。受信者は式全体の戻り値、つまりIRbが出力するものです。

+0

+1すっきり言った。 –

+0

それはまさにあなたが求めるものであり、あなたが何を意味するものでもありません! –

関連する問題