Ruby - Hash不存储密钥

时间:2011-04-16 11:22:56

标签: ruby hash keyset

我在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的结果中?

由于

1 个答案:

答案 0 :(得分:5)

问题

致电

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

你改变了Hash的默认对象。事实上,在那之后,每个可能的密钥都会传递“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专家,所以如果有一些建议,请添加评论)