2015-08-08 82 views

回答

18

下面是简单的例子,会告诉你简单的区别ruby​​ hash & a“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 
  • class HashWithIndifferentAccess继承自ruby“Hash”&以上的特殊行为被添加进来。
+1

完美的例子 –

3

在Ruby哈希:

hash[:key] 
hash["key"] 

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

引述官方documentation这样:

实现,其中键的哈希:foo和 “富” 被认为是 相同。

在内部作为 整个写入接口键(呼叫[] =,合并,等)一起使用时的符号被映射到的字符串。该映射 属于公共接口。例如,给定:

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

您是 保证关键是返回一个字符串:

hash.keys # => ["a"]

+0

我认为在HashWithIndifferentAccess的情况下,在整个写入接口(调用[] =,merge等)中用作键时,符号被映射到字符串。这样对吗? –

+0

是的。内部符号在整个写入界面(调用[] =,合并等)中用作键时映射到字符串。该映射属于公共接口。 – shivam