技術ブログ

(技術系中心)基本自分用備忘録なので、あくまで参考程度でお願いします。

Hash から文字列でもシンボルでも値を取り出す

Hash から文字列でもシンボルでも値を取り出す

先日のプルリクでhashの文字列とシンボルで取り出す実装をそれぞれ分けていたら、コメントで「with_indifferent_access」を利用してください。というコメントが....

なんだwith_indifferent_accessとは?と思い調べてみました。

with_indifferent_access

結論から言うと、Hash から文字列でもシンボルでも値を取り出す事が出来るメソッドです。

Ruby の Hash は key が文字列かシンボルかどうかを区別するので、文字列の場合は文字列のみ取得し、シンボルの場合はシンボルのみ取得します。

hash = {hoge: ''}
hash[:hoge]  #=> "俺"
hash['hoge'] #=> nil

hash = { 'hoge' => ''}
hash[:hoge]  #=> nil
hash['hoge'] #=> "俺"

ただ、key が文字列かシンボルか意識しなくても value を取り出したいケースもありますよね。

その時に利用するのがwith_indifferent_accessメソッドになります。

require 'active_support'
require 'active_support/core_ext'

sugoi_hash =  {hoge: ''}.with_indifferent_access
sugoi_hash[:yuno]  #=> "俺"
sugoi_hash['yuno'] #=> "俺"