Ruby
Rails

多重階層のハッシュをストレス無く作れるクラスを作ってみた

{1=>{2=>{3=>"a"}}} みたいな多重階層ハッシュを簡単に扱えるようにHashをちょっと改良したクラスを作ってみました。

ruby
class MyHash < Hash
  def [](key)
    if has_key? key
      super
    else
      self[key] = self.class.new
    end
  end
end

ちょっと雑ですが、以下のようにさくっと動きます。

irb

my_hash = MyHash.new

my_hash[1][2][3] = "a"

puts my_hash
=> {1=>{2=>{3=>"a"}}}

ループするとこんな感じ

my_hash = MyHash.new

data = [
  [2018, 3, 20, "◯"],
  [2018, 3, 21, "☓"],
  [2018, 3, 22, "◯"],
  [2018, 4, 20, "◯"],
  [2018, 4, 21, "◯"],
  [2018, 4, 22, "☓"],
  [2019, 4, 20, "◯"],
  [2019, 4, 21, "◯"],
  [2019, 4, 22, "☓"],
].each do |(a,b,c,d)|
  my_hash[a][b][c] = d
end

puts my_hash
=> {2018=>{3=>{20=>"◯", 21=>"☓", 22=>"◯"}, 4=>{20=>"◯", 21=>"◯", 22=>"☓"}}, 2019=>{4=>{20=>"◯", 21=>"◯", 22=>"☓"}}}