web-dev-qa-db-fra.com

Si j'ai un hachage dans Ruby on Rails, y a-t-il un moyen de lui rendre l'accès indifférent?

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

h[:foo]
h['foo']

sont identiques? (est-ce que cela s'appelle un accès indifférent?)

Les détails: j'ai chargé ce hachage en utilisant ce qui suit dans initializers mais ne devrait probablement pas faire de différence:

SETTINGS = YAML.load_file("#{Rails_ROOT}/config/settings.yml")
57
Sarah W

Vous pouvez simplement utiliser with_indifferent_access.

SETTINGS = YAML.load_file("#{Rails_ROOT}/config/settings.yml").with_indifferent_access
86
Austin Taylor

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

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

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
17
Psylone

Utilisez HashWithIndifferentAccess au lieu de Hash normal.

Pour être complet, écrivez:

SETTINGS = HashWithIndifferentAccess.new(YAML.load_file("#{Rails_ROOT}/config/settings.yml"­))
3
nathanvda
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
1
TheVinspro