読者です 読者をやめる 読者になる 読者になる

Rubyでハッシュのキーをシンボルに統一する

ハッシュのキーは全てシンボルにしたい派.しかし,YAML を使っていると「key: value」を load したときに {"key"=>"value"} になってしまう.だからといって「:key: value」と書くのも面倒.

ということで Hash のキーをシンボルに統一するメソッド symbolize_keys を Hash クラスに追加した.

class Hash
  def symbolize_keys
    inject({}) do |options, (key, value)|
      value = value.symbolize_keys if defined?(value.symbolize_keys)
      options[(key.to_sym rescue key) || key] = value
      options
    end
  end
end

hash = {"a" => "aaa", "b" => {c: "ccc", "d"=>"ddd"}, "e" => "eee"}
# => {"a"=>"aaa", "b"=>{:c=>"ccc", "d"=>"ddd"}, "e"=>"eee"}
hash.symbolize_keys
# => {:a=>"aaa", :b=>{:c=>"ccc", :d=>"ddd"}, :e=>"eee"}

Rails を再帰的に利用できるように1行追加しただけ.再帰が嫌ならブロック内の1行目(value = ...)を削除.例のようにキーにシンボルと文字列が混ざっていても問題なく動作する.