Ruby Symbols vs Strings in hashes
У меня есть этот хеш:
{
"title"=>"Navy to place breath-test machines on all its ships",
"url"=>"http://feeds.washingtonpost.com/click.phdo?i=a67626ca64a9f1766b8ba425b9482d49"
}
Оказывается, что
hash[:url] == nil
и
hash['url'] == "http://feeds.washingtonpost.com/click.phdo?i=a67626ca64a9f1766b8ba425b9482d49"
Почему? Не должно ли это работать?
Ответы
Ответ 1
Так как символ не совпадает со строкой:
:url == 'url' #=> false
В качестве хеш-ключей они будут отличаться. Возможно, вы видели это поведение в Rails? Ruby on Rails использует HashWithIndifferentAccess, который отображает все в String внутри, поэтому вы можете сделать это:
h = HashWithIndifferentAccess.new
h['url'] = 'http://www.google.com/'
h[:url] #=> 'http://www.google.com/'
Ответ 2
:url
является Symbol, который отличается от String 'url'
> :ruby == "ruby"
=> false
Вы можете конвертировать назад и вперед между ними с помощью to_s
и to_sym
> "ruby".to_sym
=> :ruby
> :ruby.to_s
=> "ruby"
Ответ 3
Почему? --- Потому что :url
и 'url'
разные, т.е. :url != 'url'
.
Разве это не должно работать? --- Нет.