Qual è la differenza tra Ruby's Hash
e ActiveSupport's HashWithIndifferentAccess
? Qual è il migliore per gli hash dinamici?Differenza tra Ruby's Hash e HashWithIndifferentAccess di ActiveSupport
risposta
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.
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"]
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? –
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
esempio perfetto –