2015-08-08 80 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