2

私はirbで以下を実行しました:

irb(main):068:0* map = Hash.new(Array.new)
=> {}
irb(main):069:0> map["a"]
=> []
irb(main):070:0> map["a"].push("hello")
=> ["hello"]
irb(main):071:0> map["a"].push(1)
=> ["hello", 1]
irb(main):072:0> map.has_key?("a")
=> false
irb(main):073:0> map.keys
=> []
irb(main):074:0>

ハッシュにキー"a"を追加すると、結果に表示されないのはHash#keysなぜですか?

ありがとう

4

1 に答える 1

5

問題

電話することで

map["a"].push("hello")

ハッシュのデフォルト オブジェクトを変更します。実際、その後、すべての可能なキーは「hello」を配信しますが、キーは実際には初期化されていません。ハッシュはデフォルトのオブジェクトしか知りませんが、キーを「初期化」するように指示していません。

ruby-1.9.2-head :002 > map["a"].push("Hello")
 => ["Hello"] 
ruby-1.9.2-head :003 > map["a"]
 => ["Hello"] 
ruby-1.9.2-head :004 > map["b"]
 => ["Hello"] 
ruby-1.9.2-head :004 > map.keys
 => [] 

あなたがしたいことは、具体的にキーを初期化することです:

ruby-1.9.2-head :008 > map["a"] = Array.new
 => [] 
ruby-1.9.2-head :009 > map.keys
 => ["a"]

しかし、これは本当にあなたが望むものではありません。

解決:

このデフォルトの動作は、次のメソッドを使用してハッシュを初期化することで実現できます。

map = Hash.new { |hash, key| hash[key] = Array.new }

例えば:

ruby-1.9.2-head :010 > map = Hash.new { |hash, key| hash[key] = Array.new }
 => {} 
ruby-1.9.2-head :011 > map["a"]
 => [] 
ruby-1.9.2-head :012 > map["b"]
 => [] 
ruby-1.9.2-head :013 > map.keys
 => ["a", "b"] 

(私は Ruby の専門家ではないので、提案があればコメントを追加してください)

于 2011-04-16T11:32:47.213 に答える