Ruby的Hash和ActiveSupport的HashWithIndifferentAccess之间的区别

Bib*_*rma 16 ruby hash ruby-on-rails activesupport

Ruby Hash和ActiveSupport有什么区别HashWithIndifferentAccess?动态哈希哪个最好?

小智 26

下面是一个简单的例子,它将向您展示简单的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 
Run Code Online (Sandbox Code Playgroud)

::的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 
Run Code Online (Sandbox Code Playgroud)
  • class HashWithIndifferentAccess继承自ruby"Hash"及以上特殊行为.

  • 完美的例子 (3认同)

shi*_*vam 7

在 Ruby 哈希中:

hash[:key]
hash["key"]
Run Code Online (Sandbox Code Playgroud)

是不同的。在HashWithIndifferentAccess顾名思义,您可以访问key两种方式。

引用官方文档对此:

实现一个散列,其中键 :foo 和 "foo" 被认为是相同的。

在整个编写界面(调用 []=、merge 等)中用作键时,内部符号会映射到字符串。此映射属于公共接口。例如,给定:

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

您可以保证密钥作为字符串返回:

hash.keys # => ["a"]