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++"}}}}