2012-03-15 18 views
13

mam ten hash:Ruby Symbole vs smyczki mieszań

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

Okazuje się, że

hash[:url] == nil 

i

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

Dlaczego? Czy to nie powinno działać?

Odpowiedz

23

Ponieważ symbol nie jest taka sama jak ciąg:

:url == 'url' #=> false 

Jako klucze skrótów będą różne. Być może widziałeś to zachowanie w Railsach? Ruby on Rails używa HashWithIndifferentAccess który odwzorowuje wszystko do łańcucha wewnętrznie, więc można to zrobić:

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

Było szynach. Och, życie nauki Railsów w tym samym czasie co Ruby. –

+4

Przepraszam za pedantyczność, ale HashWithInDifferentAccess faktycznie sprawdza, czy klucz jest Symbolem i nie jest wciskany w łańcuch, jeśli tak jest, a nie odwrotnie https://github.com/rails/rails/blob/3d6eafe32ed498784dba2b9782bbf7df47ebeb6b/activesupport /lib/active_support/hash_with_indifferent_access.rb#L152 –

+0

Dobry połów. Zaktualizowano. –

2

Dlaczego? --- Ponieważ :url i 'url' są różne, tj. :url != 'url'.

Czy nie powinno to działać z? --- Nie.

4

:url jest Symbol który jest inny niż String'url'

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

można przekształcić w tę iz powrotem między nimi za pomocą to_s i to_sym

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