RubyのHash
とActiveSupportのHashWithIndifferentAccess
の違いは何ですか?動的ハッシュに最適なのはどれですか?
以下は、単純なものの違いを示す簡単な例ですRubyハッシュと "ActiveSupport :: 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
Rubyハッシュ:
_hash[:key]
hash["key"]
_
異なっています。名前が示すように、HashWithIndifferentAccess
では、どちらの方法でもkey
にアクセスできます。
公式の引用 ドキュメント これに:
キー:fooと "foo"が同じであると見なされるハッシュを実装します。
そして
書き込みインターフェイス全体でキーとして使用される場合([] =の呼び出し、マージなど)、内部的にシンボルは文字列にマップされます。このマッピングはパブリックインターフェイスに属しています。たとえば、次のようになります。
hash = ActiveSupport::HashWithIndifferentAccess.new(a: 1)
キーが文字列として返されることが保証されます。
_
hash.keys # => ["a"]
_