2012-03-15 3 views
13

У меня есть этот хэш:Рубин Символы против струнных хэши

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

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

ответ

23

Поскольку символ не такой же, как a строка:

:url == 'url' #=> false 

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

h = HashWithIndifferentAccess.new 
h['url'] = 'http://www.google.com/' 
h[:url] #=> 'http://www.google.com/' 
+2

Это Rails. О, жизнь обучения Rails в то же время, что и Ruby. –

+4

Извините, что вы педантичны, но HashWithInDifferentAccess на самом деле просто проверяет, является ли ключ символом и принуждает его к String, если это так, а не наоборот. Https://github.com/rails/rails/blob/3d6eafe32ed498784dba2b9782bbf7df47ebeb6b/activesupport /lib/active_support/hash_with_indifferent_access.rb#L152 –

+0

Хороший улов. Обновлено. –

2

Почему? --- Потому что :url и 'url' разные, т. Е. :url != 'url'.

Должен ли он работать ни с одним из них? --- Нет.

4

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

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

можно преобразовать назад и вперед между ними с помощью to_s и to_sym

> "ruby".to_­sym 
=> :ruby 
> :ruby.to_s 
=> "ruby" 
Смежные вопросы