RubyのHashには存在しないキーにアクセスされた際のデフォルト値を設定することができる。デフォルトのデフォルト値はnilである。デフォルト値の設定には、コンストラクタの引数を与える方法と、コンストラクタにブロックを与える方法の、2通りがある。
コンストラクタの引数を与える方法
Hash.new
の引数をデフォルト値とする方法である。デフォルト値として返されるのは、すべて同一のオブジェクトということに注意しよう。
以下の例ではHash.new
でデフォルト値をhoge
としている。それをsub!
でpiyo
に変更すると、別のキーで返されるデフォルト値もpiyo
になる事を示す。
hash = Hash.new('hoge')
p hash[:foo] # => "hoge"
hash[:foo].sub!('hoge', 'piyo')
p hash[:bar] # => "piyo"
コンストラクタにブロックを与える方法
Hash.new
のブロックをデフォルト値とする方法である。存在しないキーにアクセスされる度にブロックが評価され、その結果が返される。
以下の例ではHash.new
にhoge
を返すブロックを指定している。先ほどの例と同じように、それをsub!
でpiyo
に変更しているが、都度ブロックを評価した結果が返されるので、sub!
は何らデフォルト値に影響を与えない。
hash = Hash.new{'hoge'}
p hash[:foo] # => "hoge"
hash[:foo].sub!('hoge', 'piyo')
p hash[:bar] # => "hoge"