2015-08-08 12 views

risposta

18

Di seguito si riporta l'esempio semplice che vi mostrerà differenza tra semplice ruby ​​hash & un "ActiveSupport :: HashWithIndifferentAccess"

  • HashWithIndifferentAccess ci permette di accedere tasto cancelletto come un simbolo o una stringa

semplice rubino 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 
    classe
  • HashWithIndifferentAccess è ereditata da "Hash" ruby ​​& sopra il comportamento speciale è aggiunto in esso.
+1

esempio perfetto –

3

In Ruby Hash:

hash[:key] 
hash["key"] 

sono diversi. In HashWithIndifferentAccess come suggerisce il nome, è possibile accedere a key in entrambi i casi.

Citando ufficiale documentation a questo:

Implementa un hash in cui le chiavi: foo e "foo" sono considerati la stessa.

e

Internamente simboli vengono mappati alle stringhe quando viene utilizzato come chiavi in ​​tutta l'interfaccia di scrittura (chiamando [] =, unire, ecc). Questa mappatura appartiene all'interfaccia pubblica. Ad esempio, dato:

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

Sei garantito che la chiave viene restituito come una stringa:

hash.keys # => ["a"]

+0

Penso che in caso di HashWithIndifferentAccess, i simboli vengono associati alle stringhe quando vengono utilizzati come chiavi nell'intera interfaccia di scrittura (chiamata [] =, unione, ecc.). È giusto? –

+0

si. I simboli interni sono mappati alle stringhe quando vengono usati come chiavi nell'intera interfaccia di scrittura (chiamata [] =, unione, ecc.). Questa mappatura appartiene all'interfaccia pubblica. – shivam