パイの計算

class Pai < Hash
  def initialize(params)
    params.keys.each do |key|
      self[key] = params[key]
    end
  end
  def +(other)
    keys = (self.keys + other.keys).uniq
    keys.inject(Pai.new({})) do |result, key|
      result[key] = (self[key] || 0) + (other[key] || 0)
      result
    end
  end
end

pai_aa = Pai.new a: 100, b:200, c:300
pai_bb = Pai.new         b:300, c:400, d:500

pai_aa + pai_bb # {:a=>100, :b=>500, :c=>700, :d=>500}

DDDを読み直す機会があったので、素振り。

実数 + 実数 = 実数 (1+1=2)のように
パイ + パイ = パイ

の構造になっているのがポイントの一つ。