任何人都可以给我看一个红宝石的方式来检查一个密钥是否存在于一个散列中,如果它没有给它一个默认值。我假设有一个班轮使用,除非这样做,但我不确定要使用什么。如果密钥不存在创建默认值
29
A
回答
11
如果您不需要存储默认值成散列你可以用Hash#fetch
方法:
hash = {}
hash.fetch(:some_key, 'default-value') # => 'default-value'
p hash
# => {}
如果你除了需要每次访问不存在的关键时间存储您的默认值,你“再一个初始化,您可以使用Hash#new
与块做哈希:
hash = Hash.new { |hash, key| hash[key] = 'default-value' }
hash[:a] = 'foo'
p hash[:b]
# => 'default-value'
p hash
# => { :a => 'foo', :b => 'default-value' }
15
构造哈希类的接受默认值,相同的,如果匹配的密钥没有发现将被退回。
h = Hash.new("default")
h.has_key?("jake")
=> false
h["jake"]
=> "default"
h["jake"] = "26"
h.has_key?("jake")
=> true
43
如果你已经有了一个哈希,你可以这样做:
h.fetch(key, "default value")
或者你能够利用这样一个事实:不存在的键返回nil
:
h[key] || "default value"
创建哈希与默认值取决于你想要做什么。
的关键独立,不会被保存:
h = Hash.new("foo") h[1] #=> "foo" h #=> {}
依赖于密钥,将存储:
h = Hash.new { |h, k| h[k] = k * k } h[2] #=> 4 h #=> {2=>4}
3
如果要存储的默认值这可能是零,你需要计算它在储存时间:
hash = {}
...
hash.fetch(key) {|k| hash[k] = calc_default()}
1
如果您希望将默认值分配给哈希如果键不存在(还),你可以使用||=
运营商,即:
h = {some_key: 'non_default_value'}
value = h[:some_key] ||= 'default_value'
value2 = h[:non_existing_key] ||= 'default_value'
value
将被分配'non_default_value'
和value2
会被分配'default_value'
这些任务后h
将有non_existing_key
设置为'default_value'
:
{:some_key=>"non_default_value", :non_existing_key=>"default_value"}
相关问题
- 1. 默认密钥库文件不存在?
- 2. 如果密钥不存在,则设置关联数组的默认值
- 3. Redis获取密钥或设置为默认值(如果不存在)
- 4. cassandra创建密钥空间如果不存在不工作
- 5. 在Silverlight中防止密钥默认值
- 6. heapq.merge默认密钥?
- 7. RC522默认密钥
- 8. 哈希默认值取决于密钥
- 9. scala - 创建一个可变映射,默认值为(0,0)如果键不存在
- 10. 使用pkcs11Interop创建3DES密钥并输出密钥值或创建密钥值用于创建
- 11. Django的URL - 默认值,如果值不存在
- 12. Vagrant SSH默认密钥密码?
- 13. Django的创建行,如果超密钥不存在,否则更新
- 14. 用户默认值不注册新密钥?
- 15. PHP - filter_input - 设置为默认值,如果获取密钥没有设置
- 16. 创建如果不存在
- 17. mysql如果行不存在,则获取默认值
- 18. 的XPath返回默认值,如果节点不存在
- 19. 如果条目不存在,选择默认值
- 20. 枚举的默认值,如果它不存在
- 21. 如果参数不存在提供默认值
- 22. Eclipse ADT在哪里存储默认密钥库路径?
- 23. 在HKLM下创建密钥
- 24. 如何使用两个程序创建文件关联,如果同时存在则创建一个默认值?
- 25. 操作参数在无密钥时添加默认值
- 26. Ruby从预先存在的密钥字符串中创建密码密钥
- 27. 使用密钥创建yum存储库
- 28. 如何创建加密密钥
- 29. 设置默认的ssh密钥位置
- 30. 更改密钥的默认操作
使用h [键] || “默认值”不保存,如果在那里已经有假,它将被覆盖 – Sebastian 2012-06-16 07:05:16
这就是为什么我将它列为几种可能性之一。一般人们都知道他们的哈希值会是什么样子,如果你知道你不会保存布尔值,那么这是一个非常好的方法。 – 2012-06-16 09:10:22