Techioz Blog

Rubyでネストされたハッシュを動的に設定するにはどうすればよいですか?

概要

ネストされたハッシュがあるとします。

h = { 'one' =>
        {'two' =>
            {'three' => 'a'}
        }
     }

次のように変更できます。

h['one']['two']['three'] = 'b'

変数をキーとしてネストされた値を変更するにはどうすればよいですか?

次の変数があるとします。

key = "one.two.three"

動的にアクセスするには、次を使用します。

key.split('.').inject(h,:[])

しかし、もちろん、次のように設定しても機能しません。

key.split('.').inject(h,:[]) = 'b' # fails

では、ネストされたハッシュの値を動的に設定するにはどうすればよいでしょうか?

解決策

Hash#[]= は 1 つのメソッドです。最後のキーまで Hash#[] を実行し、それに対して = を実行することはできません。むしろ、最後のキーを省略し、それに対して個別に Hash#[]= を実行します。

*key, last = key.split(".")
key.inject(h, :fetch)[last] = "b"