Hashオブジェクトのキー変換
Railsでアプリケーションを作っていると、Hashオブジェクトのキーをシンボルで扱うことが多いので、わざわざキーを文字列からシンボルに変換して統一することがあります。
でも、Hashオブジェクトがネストしたりしていると、このキーの変換処理がとても煩雑になってしまいます。
そこで、次のようにHashクラスを拡張して、登録されているキーをシンボルに一括変換できるようにしています(速度に関しては、あまり考慮していません...)。
Hash.class_eval { # This method need not be defined if using rails. def symbolize_keys inject({}){ |result, (k, v)| result.update(k.to_sym => v) } end def symbolize_deep_keys hash = symbolize_keys hash.each {|k, v| case v.class.name when 'Hash' hash[k] = v.symbolize_deep_keys when 'Array' rec = Proc.new {|list| list.map {|item| case item.class.name when 'Hash' item.symbolize_deep_keys when 'Array' rec.call(item) else item end } } hash[k] = rec.call(v) end } hash end }
Rubyのオープンクラスは賛否両論あるようですが、私は「変更・拡張した方が自然」と思った時は、どんどん既存のクラスをカスタマイズする方です。