2009-11-30 6 views
12

これでデフォルト値として空のハッシュを持つハッシュを作成したかったのです。ちょっと変だけど、私はそれが役に立つと思ったとしよう。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です。以前のバージョンは試していません。

編集:それはハッシュのハッシュのハッシュである必要はありませんように簡略化例...

それは(すべてのルビーのバージョン間)の挙動が期待される
+0

1.8.7でも再現可能です。 –

答えて

17

。あなたは少しさらに実験なら、あなたは常に同じハッシュにアクセスしていることがわかります、関係なく、どの使用キー:

>> a[:a][:b] = 1 
=> 1 
>> a[:c][:d] = 2 
=> 2 
>> a[:d] 
=> {:b=>1, :d=>2} 

デフォルト引数を持つHas​​h.newが動作する方法はありません:あなたはhash[key]を行う場合そのキーがハッシュに存在するかどうかをチェックします。そうであれば、そのキーの値を返します。そうでない場合は、デフォルト値を返します。ハッシュにキーを追加せず、毎回同じデフォルトオブジェクト(コピーではない)を返します。

希望するものを得るために、代わりにデフォルトのブロックを指定したいとします。そうすれば、ブロックはハッシュにないキーにアクセスするたびに実行されます。ブロック内で新しいハッシュを作成し、そのハッシュを「ポイント」するようにキーを設定することができます。同様に:

Hash.new { |h,k| h[k] = {} } 
+0

基本的に、彼はハッシュではなくデフォルト値にキーを追加しました。 – Riking

関連する問題