Ruby Symbols vs Strings in Hashes - PullRequest
       21

Ruby Symbols vs Strings in Hashes

13 голосов
/ 15 марта 2012

У меня есть этот хэш:

{
  "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"

Почему?Разве это не должно работать с любым из них?

Ответы [ 3 ]

23 голосов
/ 15 марта 2012

Поскольку символ не совпадает со строкой:

:url == 'url' #=> false

В качестве ключей хеш-функции они будут другими.Возможно, вы видели такое поведение в Rails?В Ruby on Rails используется HashWithIndifferentAccess , который внутренне отображает все в строку, поэтому вы можете сделать это:

h = HashWithIndifferentAccess.new
h['url'] = 'http://www.google.com/'
h[:url] #=> 'http://www.google.com/'
4 голосов
/ 15 марта 2012

:url - это символ , который отличается от String 'url'

> :ruby == "ruby­"
=> false

Вы можете конвертировать между ними, используя to_s и to_sym

> "ruby".to_­sym
=> :ruby
> :ruby.to_s
=> "ruby"
2 голосов
/ 15 марта 2012

Почему? --- Потому что :url и 'url' отличаются, т. Е. :url != 'url'.

Разве это не должно работать ни с одним?

...