What is the difference between Ruby’s Hash
and ActiveSupport’s HashWithIndifferentAccess
? Which is the best for dynamic hashes?
Below is the simple example that will show you difference between simple ruby hash & a "ActiveSupport::HashWithIndifferentAccess"
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
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"]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With