2012-02-02 79 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"}

相關問題