Разница между Rubys Hash и ActiveSupports HashWithIndifferentAccess

В чем разница между Rubys Hash и ActiveSupports HashWithIndifferentAccess? Что лучше для динамических хэшей?

Ответ 1

Ниже приведен простой пример, который покажет вам разницу между простым ruby ​​hash и "ActiveSupport:: HashWithIndifferentAccess"

  • HashWithIndifferentAccess позволяет нам получить доступ к хеш-ключу в качестве символа или строки

Простой 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 
  • класс HashWithIndifferentAccess наследуется от ruby ​​ "Hash" и выше добавляется специальное поведение.

Ответ 2

В Ruby Hash:

hash[:key]
hash["key"]

разные. В HashWithIndifferentAccess, как следует из названия, вы можете получить доступ к key в любом случае.

Процитировать официальную документацию:

Реализует хэш, где ключи: foo и "foo" считаются то же самое.

и

Внутренние символы отображаются на строки при использовании в качестве ключей в весь интерфейс записи (вызов [] =, слияние и т.д.). Это отображение принадлежит публичному интерфейсу. Например, данный:

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

Вы гарантирует, что ключ возвращается как строка:

hash.keys # => ["a"]