2012-02-02 67 views
29

任何人都可以给我看一个红宝石的方式来检查一个密钥是否存在于一个散列中,如果它没有给它一个默认值。我假设有一个班轮使用,除非这样做,但我不确定要使用什么。如果密钥不存在创建默认值

回答

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} 
    
+2

使用h [键] || “默认值”不保存,如果在那里已经有假,它将被覆盖 – Sebastian 2012-06-16 07:05:16

+0

这就是为什么我将它列为几种可能性之一。一般人们都知道他们的哈希值会是什么样子,如果你知道你不会保存布尔值,那么这是一个非常好的方法。 – 2012-06-16 09:10:22

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"}