别名自定义Ruby Hash类

时间:2014-04-05 17:15:56

标签: ruby hash subclass

我正在编写一个应用程序来存储运行大量指标的竞赛结果。结果有这些限制:

  • "dq_reasons"指的是字符串数组
  • 所有其他键默认为Float 0.0

我喜欢使用自定义ContestResult类显式限制这些约束。我希望这个班级是Hash。我可以继承:

MyThing = Class.new(OtherThing)

但是我heard子类化核心Ruby类有缺点。我还有什么其他选择?如何将类实例设置为具有默认值的哈希并将"dq_reasons"键预设为空数组?

目前的尝试:

class ContestResult < Hash
  extend Forwardable
  def_delegators :@data, :[], :[]=, :each
  def initialize(lyst)
    @data = Hash.new {|h,k| h[k] = 0.0}
    @data["dq_reasons"] = []
    lyst.each {|li| @data[li]}
  end
  def inspect
    @data
  end
end

当前功能:

c = ContestResult.new([1,2,3])
# => {"dq_reasons"=>[], 1=>0.0, 2=>0.0, 3=>0.0} 
c[4] # => 0.0
c[3] = 34.5
c # => {"dq_reasons"=>[], 1=>0.0, 2=>0.0, 3=>34.5, 4=>0.0} 

1 个答案:

答案 0 :(得分:0)

如果我能正确理解您的问题,您可以

h = {"dq_reasons"=>[]}

然后打电话给Hash#fetch。您可以为其提供默认值。

h.fetch(4, 0.0)