開発^3

Web開発、宇宙開発、ゲーム開発の3種類についてつらつらと

Rubyで階層の深いHashを手軽に作成する

元ネタ
階層の深いHashを作成するときに知っておいたら便利なこと - (゚∀゚)o彡 sasata299's blog

#!/usr/bin/ruby
 
hash = Hash.new { |h,k| h[k] = {} }
 
hash["foo"]["bar"] = 1
p hash # {"foo"=>{"bar"=>1}}

元ネタで紹介されているのは上記の方法ですね。
2階層の場合はこれで問題ないんですが、三階層以上の場合にエラるんですよね。

#!/usr/bin/ruby

hash = Hash.new { |h,k| h[k] = {} }
hash["hoge"]["piyo"]["neko"] = 3 # base.rb:4:in `<main>': undefined method `[]=' for nil:NilClass (NoMethodError)

とうことで

何階層でも自動生成してくれる方法を考えてみました。
基本的な考え方は一緒で、生成部分をProcにすることで毎回呼ぶように変更した感じ。
proc_hashと変数を作らないといけないのがちょっと難点。変数なくせないかlambdaやら試してみましたが上手く行かなかったです。残念。

proc_hash = Proc.new { |h, k| h[k] = Hash.new &proc_hash; }
hash = Hash.new &proc_hash

hash["foo"]["bar"] = 1
p hash # {"foo"=>{"bar"=>1}}

hash["a"]["b"]["c"] = 5
p hash # append {"a"=>{"b"=>{"c"=>5}}}

hash["neko"]["inu"]["saru"]["kiji"] = "momotarou++"
p hash # append {"neko"=>{"inu"=>{"kiji"=>{"saru"=>"momotarou++"}}}}