2012-02-21 24 views
11

Estoy llamando a una API de terceros (escrita en PHP) pasando algunos pares clave/valor.Ruby Hash.new vs Hash literal

Este código funciona:

h = Hash.new 
h['first_name'] = "Firstname" 
h['last_name'] = "Lastname" 
APICall([h]) # Record gets created 

Esto no es así:

h = {'first_name' => "Firstname", 'last_name' => "Lastname"} 
APICall([h]) # Record does not get created 

Cuando yo tiro el hash a la consola en ambos casos las tengo la misma estructura de datos. Entonces, ¿por qué es que la primera forma funciona pero la segunda no?

EDITAR: No estoy seguro de si esto importa, pero estoy usando Ruby 1.8.7p72/Linux. También uno de los pares clave/valor es una cadena de imagen codificada en Base64.

+2

Hay no hay razón para que esto suceda En mis pruebas, 'Hash.object_id' devolvió el mismo valor que' Hash.new.class.object_id' y '{} .class.object_id'. Son todos de la misma clase. ¿Recibes algún error de la llamada API? – Brandan

+1

Me parecen iguales. Si esto es todo tu código, no estoy seguro de por qué uno funcionaría y el otro no. Si esta es una aplicación de Rails, me gustaría ver que se ve afectado por el uso de un Hash donde se requiere [HashWithIndifferentAccess] (http://as.rubyonrails.org/classes/HashWithIndifferentAccess.html) (esto es solo una corazonada , si su código es como el anterior, este no sería su problema). – gar

+0

@Brandan: desafortunadamente no hay errores devueltos por la API. –

Respuesta

1

como la documentación de la clase Hash afirma:

[](*args) public

Crea un nuevo hash de poblado con los objetos dados. Equivalente al literal {clave => valor, ...}. En la primera forma, las claves y los valores se presentan en pares, por lo que debe haber un número par de argumentos. La segunda y la tercera forma toman un solo argumento que es una matriz de pares clave-valor o un objeto convertible a un hash.

Hash["a", 100, "b", 200]    #=> {"a"=>100, "b"=>200} 
Hash[ [ ["a", 100], ["b", 200] ] ] #=> {"a"=>100, "b"=>200} 
Hash["a" => 100, "b" => 200]   #=> {"a"=>100, "b"=>200} 

http://apidock.com/ruby/Hash/%5B%5D/class

Así que al menos Hash[] deberían tener el mismo comportamiento que {...}

+6

¿Qué tiene eso que ver con la pregunta? –

+0

que es posible que 'Hash.new' produzca algo diferente al literal' {..} ', porque la documentación solo dice explícitamente que' Hash [] 'es equivalente al hash literal. – phoet

+2

Cada implementación que conozco produce exactamente los mismos resultados para los casos descritos en la pregunta. –

-1

El hash literal no salió hasta v1.9. Estás usando v1.8.

http://www.ruby-lang.org/en/news/2009/01/30/ruby-1-9-1-released/

Buscar este enlace para "hash de sintaxis literal":

http://svn.ruby-lang.org/repos/ruby/tags/v1_9_1_0/NEWS

Aquí es un parche para acondicionarlo la característica en v1.8:

http://bugs.ruby-lang.org/issues/1183

+14

Ruby ha tenido literales hash desde al menos 1.8.6. Lo nuevo en 1.9 es una sintaxis alternativa para los literales hash (por ejemplo, '{foo: 'bar'}' en lugar de '{: foo => 'bar'}'. El OP, sin embargo, no usa la sintaxis alternativa. –