2012-11-15 196 views
1

我有下面的代碼創建一個數組反對哈希:Ruby的哈希使用密鑰值

tp = TupleProfile.new(98, 99) 
keyDict = Hash[Array[98,99] => tp] 
keyDict[[98,99]].addLatency(0.45) 
puts keyDict[[98,99]].getAvg() 

這工作,但我希望能夠調用addLatency不檢查現有哈希值:

keyDict[[100,98]].addLatency(0.45) #throws error right now 

所以我想創建一個變化的基礎上的鍵的默認值,是這樣的:

keyDict = Hash.new(TupleProfile.new(theKey[0], theKey[1])) 

其中theKey是某種特殊指令。有沒有合理的乾淨的方法來做到這一點,或者我最好每次檢查或爲散列做一個包裝類?

回答

3

嘗試Hash.new塊表示法:

keyDict = Hash.new {|hash,key| hash[key] = TupleProfile.new(*key) } 

使用標準參數表示法(Hash.new(xyz))將實際上只實例化所述散列單個TupleProfile對象;這樣每個密鑰都會有一個。

1

如果我理解你的問題,我想你可能可以使用default procedure。如果您詢問不存在的密鑰,則默認過程中的代碼將會運行。下面是使用的元組鍵的示例:

class Test 
    def initialize(a,b); @a = a; @b = b; end 
    attr_accessor :a, :b 
end 

keyDict = {} 

keyDict.default_proc = proc do |hash, (key1, key2)| 
    hash[[key1, key2]] = Test.new(key1, key2) 
end 


keyDict[[99,200]] 
=> #<Test:0x007f9681ad2720 @a=99, @b=200> 

keyDict[[99,200]].a 
=> 99 
+0

我得到的default_proc線這個錯誤:'未定義的方法\'default_proc =」爲{}:散列(NoMethodError)'' – jtpereyda

+0

default_proc ='的溶液中加入在Ruby 1.9中。你在1.8嗎? –

相關問題