Разница между HashWithIndifferentAccess Руби хэш и ActiveSupport по

в чем разница между Руби Hash и ActiveSupport это HashWithIndifferentAccess? Что лучше всего подходит для динамических хэшей?

2 ответов


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

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

Простой Ruby Хэш

$ 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" & над специальным поведением добавляется в нем.

В Ruby Хэш:

hash[:key]
hash["key"]

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

со ссылкой на официальные документация для этого:

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

и

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

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

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

hash.keys # => ["a"]