1

我有以下代码来创建一个对象哈希数组:

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 是某种特殊指令。是否有任何合理干净的方法可以做到这一点,或者我最好每次检查或为哈希制作一个包装类?

4

2 回答 2

3

尝试Hash.new块符号:

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

使用标准参数表示法 ( Hash.new(xyz)) 实际上只会为哈希实例化一个 TupleProfile 对象;这样每个单独的键都会有一个。

于 2012-11-15T20:26:08.850 回答
1

如果我理解您的问题,我认为您可以使用默认程序。如果您请求不存在的密钥,默认过程中的代码将运行。这是使用元组键的示例:

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 
于 2012-11-15T20:59:55.320 回答