Ruby Symbols vs Strings in Hashes

2020-02-26 07:10发布

问题:

I have this hash:

{
  "title"=>"Navy to place breath-test machines on all its ships", 
  "url"=>"http://feeds.washingtonpost.com/click.phdo?i=a67626ca64a9f1766b8ba425b9482d49"
} 

It turns out that

hash[:url] == nil

and

hash['url'] == "http://feeds.washingtonpost.com/click.phdo?i=a67626ca64a9f1766b8ba425b9482d49"

Why? Shouldn't it work with either?

回答1:

Since a symbol is not the same as a string:

:url == 'url' #=> false

As hash keys they would be different. Perhaps you have seen this behavior in Rails? Ruby on Rails uses HashWithIndifferentAccess which maps everything to a String internally, so you can do this:

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


回答2:

:url is a Symbol which is different than the String 'url'

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

You can convert back and forth between the two using to_s and to_sym

> "ruby".to_­sym
=> :ruby
> :ruby.to_s
=> "ruby"


回答3:

Why?---Because :url and 'url' are different, i.e., :url != 'url'.

Shouldn't it work with either?---No.