Difference between Ruby’s Hash and ActiveSupport’s HashWithIndifferentAccess Difference between Ruby’s Hash and ActiveSupport’s HashWithIndifferentAccess ruby ruby

Difference between Ruby’s Hash and ActiveSupport’s HashWithIndifferentAccess


Below is the simple example that will show you difference between simple ruby hash & a "ActiveSupport::HashWithIndifferentAccess"

  • HashWithIndifferentAccess allows us to access hash key as a symbol or string

Simple Ruby Hash

$ irb  2.2.1 :001 > hash = {a: 1, b:2}    => {:a=>1, :b=>2}   2.2.1 :002 > hash[:a]    => 1   2.2.1 :003 > hash["a"]    => nil 

ActiveSupport::HashWithIndifferentAccess

2.2.1 :006 >   hash = ActiveSupport::HashWithIndifferentAccess.new(a: 1, b:2)NameError: uninitialized constant ActiveSupport    from (irb):6    from /home/synerzip/.rvm/rubies/ruby-2.2.1/bin/irb:11:in `<main>'2.2.1 :007 > require 'active_support/core_ext/hash/indifferent_access' => true 2.2.1 :008 > hash = ActiveSupport::HashWithIndifferentAccess.new(a: 1, b:2) => {"a"=>1, "b"=>2} 2.2.1 :009 > hash[:a] => 1 2.2.1 :010 > hash["a"] => 1 
  • class HashWithIndifferentAccess is inherited from ruby "Hash" & above special behavior is added in it.


In Ruby Hash:

hash[:key]hash["key"]

are different. In HashWithIndifferentAccess as the name suggests, you can access key either way.

Quoting official documentation to this:

Implements a hash where keys :foo and "foo" are considered to be the same.

and

Internally symbols are mapped to strings when used as keys in the entire writing interface (calling []=, merge, etc). This mapping belongs to the public interface. For example, given:

hash = ActiveSupport::HashWithIndifferentAccess.new(a: 1)

You are guaranteed that the key is returned as a string:

hash.keys # => ["a"]