Hash Defaults in Ruby

I was writing a rake task to handle importing data from an older community system and needed to set a default value for anything that the old system didn’t have. I was using hashs and thought to myself “It would be sweet if hashs had defaults.” After a quick doc check I found out that hashs do infact support defaults.

I encourage you to check out the Ruby Docs http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-default

Here’s Hash defaults at a quick glance:

h = Hash.new('cat')
h[:not_a_key]         #=> 'cat'

h = {}
h.default = 'cat'
h[:not_a_key]         #=> 'cat'

You can also feed the Hash a block that will execute on lookup

h = Hash.new {|h,k| k+1 }     => {}
h[1]                          => 2
h[2]                          => 3
h[4]                          => 5

h = Hash.new {|h,k| k.to_s + ' says meowww' }  => {}
h[:cat]                                        => 'cat says meowww'

Hashs can also take default Procs. Although as per the docs “It is not possible to set the default to a Proc that will be executed on each key lookup.”

h = {}
h.default = proc do |hash, key|
  hash[key] = key + key
end
h[2]       #=> #<Proc:0x401b3948@-:6>

To utiize Procs properly you must use the default_proc method:

h.default_proc = proc do |hash, key|
  hash[key] = key + key
end
h[2]       #=> 4
h["cat"]   #=> "catcat"