59 votes

Si j'ai un hash en Ruby on Rails, y a-t-il un moyen de le rendre d'accès indifférent ?

Si j'ai déjà un hachage, puis-je faire en sorte que

h[:foo]
h['foo']

sont les mêmes ? (cela s'appelle-t-il un accès indifférent ?)

Les détails : J'ai chargé ce hachage en utilisant la commande suivante dans initializers mais ça ne devrait pas faire de différence :

SETTINGS = YAML.load_file("#{RAILS_ROOT}/config/settings.yml")

88voto

Austin Taylor Points 3966

Vous pouvez simplement utiliser with_indifferent_access .

SETTINGS = YAML.load_file("#{RAILS_ROOT}/config/settings.yml").with_indifferent_access

27voto

moritz Points 9491

Si vous avez déjà un hachage, vous pouvez le faire :

HashWithIndifferentAccess.new({'a' => 12})[:a]

17voto

Psylone Points 1159

Vous pouvez également écrire le fichier YAML de cette façon :

--- !map:HashWithIndifferentAccess
one: 1
two: 2

après ça :

SETTINGS = YAML.load_file("path/to/yaml_file")
SETTINGS[:one] # => 1
SETTINGS['one'] # => 1

4voto

nathanvda Points 25878

Utilice HashWithIndifferentAccess au lieu du hachage normal.

Pour être complet, écrivez :

SETTINGS = HashWithIndifferentAccess.new(YAML.load_file("#{RAILS_ROOT}/config/settings.yml"­))

2voto

TheVinspro Points 196
You can just make a new hash of HashWithIndifferentAccess type from your hash.

hash = { "one" => 1, "two" => 2, "three" => 3 }
=> {"one"=>1, "two"=>2, "three"=>3}

hash[:one]
=> nil 
hash['one']
=> 1 

make Hash obj to obj of HashWithIndifferentAccess Class.

hash =  HashWithIndifferentAccess.new(hash)
hash[:one]
 => 1 
hash['one']
 => 1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X