概要
Ruby の Hash は key が文字列かシンボルかどうかを区別します。
例
hash = { yuno: 'ゆの', miyako: '宮子' }
hash[:yuno] #=> "ゆの"
hash['yuno'] #=> nil
hash = { 'sae' => '沙英', 'hiro' => 'ヒロ' }
hash[:sae] #=> nil
hash['sae'] #=> "沙英"
きっちりしてて結構なんだけど、
key が文字列かシンボルか意識しなくても value を取り出せるとありがたい場合もありますよね。
そういえば、Rails 4 の Controller の params
って文字列でもシンボルでも value を取り出せますよね。
あれの型は実は Hash ではなくて Hash のサブクラスである ActiveSupport::HashWithIndifferentAccess なんです!
(正確には、さらにそのサブクラスである ActionController::Parameters です。)
Hash を HashWithIndifferentAccess に変えてその恩恵を受けるには Hash#with_indifferent_access
というインスタンスメソッドを利用します。
例
require 'active_support'
require 'active_support/core_ext'
sugoi_hash = { yuno: 'ゆの', miyako: '宮子' }.with_indifferent_access
sugoi_hash[:yuno] #=> "ゆの"
sugoi_hash['yuno'] #=> "ゆの"
やったね宮ちゃん! (ドヤァ