问题
通过调用
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 专家,所以如果有什么建议请添加评论)