2012-03-15 22 views
13

que tienen este hash:Rubí Símbolos vs cadenas en valores hash

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

Resulta que

hash[:url] == nil 

y

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

¿Por qué? ¿No debería funcionar con ninguno?

Respuesta

23

Desde un símbolo no es la misma que una cadena:

:url == 'url' #=> false 

Como las teclas hash serían diferentes. Tal vez has visto este comportamiento en Rails? Ruby on Rails utiliza HashWithIndifferentAccess que mapea todo para una cadena internamente, por lo que se puede hacer esto:

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

Fue rieles. Oh la vida de aprender Rails al mismo tiempo que Ruby. –

+4

Perdón por ser pedante, pero HashWithInDifferentAccess en realidad solo comprueba si la clave es un Símbolo y coacciona en una Cadena si ese es el caso, no al revés https://github.com/rails/rails/blob/3d6eafe32ed498784dba2b9782bbf7df47ebeb6b/activesupport /lib/active_support/hash_with_indifferent_access.rb#L152 –

+0

Buena captura. Actualizado. –

2

¿Por qué? --- Porque :url y 'url' son diferentes, es decir, :url != 'url'.

¿No debería funcionar con ninguno? --- No.

4

:url es una Symbol que es diferente a la String'url'

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

Puede convertir de ida y vuelta entre los dos usando to_s y to_sym

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