2011-05-03 20 views
6
{"user"=> 
    {"bio"=>"rubyist", 
    "created_at"=>"2011-05-03T15:21:46+02:00", 
    "email"=>"[email protected]", 
    "id"=>61, "name"=>"paul", 
    "updated_at"=>"2011-05-03T15:21:46+02:00"}} 

¿Cuál es la diferencia entre el uso de comillas dobles y comillas simples ?:¿Cuál es la diferencia entre usar comillas simples y comillas dobles para consultar un hash en Ruby?

attributes = JSON.parse(last_response.body)["user"] 
attributes = JSON.parse(last_response.body)['user'] 

Parece que el primer caso funciona, pero el segundo caso no se encuentra ninguna tecla. No entiendo por qué.

+6

No debería haber ninguna diferencia en absoluto ... ¿Cuál es el error exacto que obtienes en el segundo? –

+2

Y si intercambia ambas filas en orden, ¿sigue siendo la variante con las comillas dobles las que funcionan? – moritz

+2

No creo que realmente estés obteniendo los resultados que dices que eres. En este caso, no es posible que Ruby se comporte de manera diferente. – Phrogz

Respuesta

3

eso es extraño, que deben trabajar de la misma manera y hacer por mí:

>> user = {"user"=> 
..  {"bio"=>"rubyist", 
..   "created_at"=>"2011-05-03T15:21:46+02:00", 
..   "email"=>"[email protected]", 
..   "id"=>61, "name"=>"paul", 
..   "updated_at"=>"2011-05-03T15:21:46+02:00"}}.to_json 
#=> "{"user":{"bio":"rubyist","created_at":"2011-05-03T15:21:46+02:00","email":"[email protected]","id":61,"name":"paul","updated_at":"2011-05-03T15:21:46+02:00"}}" 
>> attributes = JSON.parse(user)["user"] 
#=> {"bio"=>"rubyist", "created_at"=>"2011-05-03T15:21:46+02:00", "email"=>"[email protected]", "id"=>61, "name"=>"paul", "updated_at"=>"2011-05-03T15:21:46+02:00"} 
>> attributes = JSON.parse(user)['user'] 
#=> {"bio"=>"rubyist", "created_at"=>"2011-05-03T15:21:46+02:00", "email"=>"[email protected]", "id"=>61, "name"=>"paul", "updated_at"=>"2011-05-03T15:21:46+02:00" 
6

En el caso de una clave de texto sin formato como "usuario" en realidad no debería hacer ninguna diferencia, que es extraño es no funciona de hecho Pero si su clave es una expresión como, por ejemplo, "# {variable_here}", no se evaluará a menos que esté utilizando comillas dobles. ¿Es este el caso?

6

Una diferencia importante entre comillas simples y comillas dobles en Ruby es que las comillas dobles realizan interpolación de cadenas, mientras que las comillas simples no lo hacen:

ruby-1.9.2-p180 :001 > puts "one plus one is #{1 + 1}" 
one plus one is 2 
=> nil 
ruby-1.9.2-p180 :002 > puts 'one plus one is #{1 + 1}' 
one plus one is #{1 + 1} 
=> nil 

En su caso, cuando se accede a un hash, se debe hacer sin diferencia:

ruby-1.9.2-p180 :003 > {'one' => 1}['one'] 
=> 1 
ruby-1.9.2-p180 :004 > {'one' => 1}["one"] 
=> 1 
7

Para las diferencias, ya hay otras buenas respuestas. Sospecho que no tienes la cita única de un byte.

Tal vez, es posible que tenga acentos graves:

attributes = JSON.parse(last_response.body)[`user`] 

o varios bytes comillas simples:

attributes = JSON.parse(last_response.body)[’user’] 

Si ese es el caso, deben ser reemplazados por las comillas simples de un byte.

+0

+1 para buenas suposiciones – Phrogz

+0

@Phrogz Gracias. – sawa

+0

Y un +1 para todos los que pasamos una hora mirando una pantalla, tratando de descubrir por qué un lenguaje está vomitando, solo para descubrir que el problema era una comilla doble o simple que estaba oculta porque la fuente que usamos estaban usando NO TENÍAN comillas rizadas. –

Cuestiones relacionadas