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オブジェクトのみがインスタンス化されます。このようにして、個々のキーごとに1つになります。

于 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 に答える