【问题标题】:Ruby hash use key value in default valueRuby 哈希在默认值中使用键值
【发布时间】:2012-11-16 04:59:55
【问题描述】:

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

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

【问题讨论】:

    标签: ruby hash default-value


    【解决方案1】:

    试试Hash.new 块表示法:

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

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

    【讨论】:

      【解决方案2】:

      如果我理解您的问题,我认为您可以使用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 
      

      【讨论】:

      • 我在 default_proc 行收到此错误:undefined method `default_proc=' for {}:Hash (NoMethodError)
      • default_proc= 在 Ruby 1.9 中添加。你在 1.8 上吗?
      猜你喜欢
      • 1970-01-01
      • 2013-04-16
      • 2014-10-10
      • 1970-01-01
      • 2014-05-23
      • 2014-01-31
      • 2011-06-30
      • 2014-01-02
      • 2016-01-31
      相关资源
      最近更新 更多