hash-initializer

Initialise Ruby hashes with multiple levels of default values

Install

gem install hash-initializer

Or add to your Gemfile and go forth.

Example usage

With numeric values

my_hash = HashInitializer[0]

my_hash[:foo]  # => 0
my_hash[:foo] += 1
my_hash[:foo]  # => 1
my_hash[:bar]  # => 0

With hash values

my_hash = HashInitializer[:hash]

my_hash[:foo]  # => {}
my_hash[:foo][:bar]  # => nil
my_hash[:foo][:bar] = 'a'
my_hash[:foo][:bar]  # 'a'

How about array values

my_hash = HashInitializer[:array]

my_hash[:foo]  # => []
my_hash[:foo] << 'a'
my_hash[:foo]  # ['a']

Watch out though, you can end up sharing the same array instance (you probably shouldn't do this!)

my_hash = HashInitializer[[]]

my_hash[:foo]  # => []
my_hash[:bar]  # => []
my_hash[:foo] << 'a'
my_hash[:foo]  # ['a']
my_hash[:bar]  # ['a']
my_hash[:foo].equal?(my_hash[:bar])  # true

… and you can end up sharing the same hash instance!

my_hash = HashInitializer[{}]

my_hash[:foo]  # {}
my_hash[:foo][:bar] = 1
my_hash[:foo][:bar]  # => 1
my_hash[:bob]  # => { bar: 1 }
my_hash[:foo].equal?(my_hash[:bob])  # true

Nested hashes

my_hash = HashInitializer[
  :hash,
    :hash,
      1.0
]

my_hash[:foo][:bar][:baz]  # => 1.0
my_hash[:foo][:bar][:baz] += 1.5
my_hash[:foo][:bar][:baz]  # => 2.5

Caution

Use with consideration! Great for temporary data (e.g. whilst processing), or for playing around. But for anything more substantial consider building a proper model layer with first class objects / structs.

Contributing to hash-initializer

Copyright © 2017 Jits. See LICENSE.txt for further details.