Если у меня есть хэш в Ruby on Rails, есть ли способ сделать его равнодушным? - PullRequest
57 голосов
/ 02 мая 2011

Если у меня уже есть хеш, могу ли я сделать так, чтобы

h[:foo]
h['foo']

одинаковы? (это называется безразличным доступом?)

Подробности: я загрузил этот хеш, используя следующее в initializers, но, вероятно, не должно иметь значения:

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

Ответы [ 5 ]

85 голосов
/ 02 мая 2011

Вы можете просто использовать with_indifferent_access.

SETTINGS = YAML.load_file("#{RAILS_ROOT}/config/settings.yml").with_indifferent_access
26 голосов
/ 02 мая 2011

Если у вас уже есть хеш, вы можете сделать:

HashWithIndifferentAccess.new({'a' => 12})[:a]
17 голосов
/ 27 января 2012

Вы также можете записать файл YAML следующим образом:

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

после этого:

SETTINGS = YAML.load_file("path/to/yaml_file")
SETTINGS[:one] # => 1
SETTINGS['one'] # => 1
3 голосов
/ 02 мая 2011

Используйте HashWithIndifferentAccess вместо обычного хэша.

Для полноты напишите:

SETTINGS = HashWithIndifferentAccess.new(YAML.load_file("#{RAILS_ROOT}/config/settings.yml"­))
1 голос
/ 22 апреля 2017
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...