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