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"]