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