Подтвердить что ты не робот

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"

Почему? Не должно ли это работать?

4b9b3361

Ответ 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'.

Разве это не должно работать? --- Нет.