web-dev-qa-db-ja.com

RubyのHashとActiveSupportのHashWithIndifferentAccessの違い

RubyのHashとActiveSupportのHashWithIndifferentAccessの違いは何ですか?動的ハッシュに最適なのはどれですか?

17
Bibek Sharma

以下は、単純なものの違いを示す簡単な例ですRubyハッシュと "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"から継承され、上記の特別な動作が追加されます。
27
Pratik

Rubyハッシュ:

_hash[:key]
hash["key"]
_

異なっています。名前が示すように、HashWithIndifferentAccessでは、どちらの方法でもkeyにアクセスできます。

公式の引用 ドキュメント これに:

キー:fooと "foo"が同じであると見なされるハッシュを実装します。

そして

書き込みインターフェイス全体でキーとして使用される場合([] =の呼び出し、マージなど)、内部的にシンボルは文字列にマップされます。このマッピングはパブリックインターフェイスに属しています。たとえば、次のようになります。

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

キーが文字列として返されることが保証されます。

_hash.keys # => ["a"]_

4
shivam