Hash.new({})がハッシュメンバーを隠すのはなぜですか? [複製]
質問
この質問にはすでに回答があります:
わかりましたので、デフォルト値として空のハッシュを持つハッシュを作成したかったのです。少し変ですが、知っていると思いますが、役に立つと思ったとしましょう。
だからここに私がやったことがあります:
>> a = Hash.new({})
=> {}
>> a[:a][:b] = 5
=> 5
>> a
=> {}
>> a[:a]
=> {:b=>5}
>> a.keys
=> []
>> a.size
=> 0
>> a[:a].size
=> 1
つまり、ハッシュを調べてもハッシュメンバーは表示されませんが、そのキーでアクセスできます。
これは予想される動作ですか?ここで何が起こっているのですか?
ところで、これはRuby 1.9.1で、以前のバージョンは試していません。
編集:ハッシュのハッシュのハッシュである必要がないため、単純化した例...
解決
これは期待される動作です(すべてのrubyバージョンで)。さらに少し実験すると、使用するキーに関係なく、常に同じハッシュにアクセスすることがわかります。
>> a[:a][:b] = 1
=> 1
>> a[:c][:d] = 2
=> 2
>> a[:d]
=> {:b=>1, :d=>2}
デフォルトの引数を指定したHash.newの動作: hash [key]
を実行すると、そのキーがハッシュに存在するかどうかがチェックされます。存在する場合、そのキーの値を返します。そうでない場合は、デフォルト値を返します。キーをハッシュに追加せず、毎回同じデフォルトオブジェクト(コピーではなく)を返します。
必要なものを取得するには、代わりにデフォルトブロックを指定します。この方法では、ハッシュにないキーにアクセスするたびにブロックが実行されます。ブロック内で新しいハッシュを作成し、キーを「ポイント」に設定できます。そのハッシュに。そのように:
Hash.new { |h,k| h[k] = {} }
所属していません StackOverflow