2009-12-01 8 views
9

Si estoy convirtiendo un hash de ruby ​​en una cadena de pares nombre-valor (para usar en parámetros HTTP, por ejemplo), ¿es esta la mejor manera?Convertir un hash en una cadena de pares de nombre-valor

# Define the hash 
fields = {"a" => "foo", "b" => "bar"} 

# Turn it into the name-value string 
http_params = fields.map{|k,v| "#{k}=#{v}"}.join('&') 

Creo que mi pregunta es:

¿Hay una manera más fácil para llegar a http_params? De acuerdo, la forma anterior funciona y es bastante sencilla, pero tengo curiosidad de saber si hay una manera de pasar del hash a la cadena sin crear primero una matriz (¿el resultado del método map)?

+1

tuya es igual que la mía. No te olvides de hacer la codificación adecuada en los valores. –

Respuesta

5

Esto es probablemente lo mejor que puede hacer. Podrías iterar a través de los pares en el hash, construyendo la cadena sobre la marcha. Pero en este caso, la cadena intermedia debería crearse y eliminarse en cada paso.

¿Tiene un caso de uso donde se trata de un cuello de botella de rendimiento? En general, Ruby está haciendo tanto trabajo detrás de escena que preocuparse por una matriz temporal como esta probablemente no valga la pena. Si le preocupa que pueda ser un problema, considere crear un perfil para la velocidad y el uso de la memoria, a menudo los resultados no son los esperados.

+0

No, no me preocupa que sea un problema de rendimiento. Sigo siendo relativamente nuevo en ruby ​​y tenía curiosidad por ver si había una manera 'más fácil'. Parece que cada vez que comienzo a escribir un método, encuentro un método de ruby ​​o de rieles que hace exactamente lo mismo (por ejemplo 'distance_of_time_in_words'). :) – jerhinesmith

8

Desde el del programador pragmático Guía:

Múltiples parámetros pasados ​​a un rendimiento se convierten en una matriz si el bloque tiene sólo un argumento.

Por ejemplo:

> fields = {:a => "foo", :b => "bar"} 
> fields.map { |a| a } # => [[:a, "foo"], [:b, "bar"]] 

lo que el código podría simplificarse así:

> fields.map{ |a| a.join('=') }.join('&') # => "a=foo&b=bar" 
+1

No veo cómo es más simple. En todo caso, oculta la intención del código detrás de la magia de "parámetros múltiples => matriz". – Ben

+0

Bueno, sin duda es una cuestión de gusto. * I * lo encuentro más simple porque construye la cadena sin que tenga que lidiar explícitamente con claves y valores. Acepto que es menos legible, sin embargo. – Christian

9

rieles proporciona to_query método de Hash clase. Proveedores:

fields.to_query

+0

¡Agradable! Esto es exactamente lo que estaba buscando. – doug

Cuestiones relacionadas