Ruby - 哈希不存储 key

标签 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>

为什么当我将 key "a" 添加到哈希后,它没有出现在 Hash#keys 的结果中?

谢谢

最佳答案

问题

通过调用

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

您更改了哈希的默认对象。事实上,此后,每个可能的键都会发出“hello”,但该键并未真正初始化。哈希只会知道其默认对象,但您没有告诉它“初始化” key 。

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
 => [] 

您可能想要做的是专门初始化 key :

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 专家,所以如果有任何建议请添加评论)

关于Ruby - 哈希不存储 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5686140/

相关文章:

Python 3安装失败 'Keyset as registered is invalid'

mysql - 创建第一个 gem,取决于 activerecord,我的测试应该命中数据库吗?

ruby-on-rails - 如何使用 Ruby 从 Active Directory 中检索已删除的对象?

memory - Redis内存优化建议

c# - 登录时比较散列和加盐密码的加密

java - 如何有意义地为 java.lang.Class<T> 定义 hashCode 和 equals?

sql-server - 键集分页 - 按跨多列的搜索词过滤

ruby - 在非 Rails Ruby 应用程序中要求所有文件的干净方法?

ruby-on-rails - 从 _form 或 Controller 保存的当前用户 ID

java - 如何在 Junit (Java) 中测试集合