В чем разница между 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"]