2009-12-01 9 views
9

Si je transforme un hachage ruby ​​en une chaîne de paires nom-valeur (à utiliser dans les paramètres HTTP, par exemple), est-ce la meilleure solution?Transformer un hachage en une chaîne de paires nom-valeur

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

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

Je suppose que ma question est:

est-il un moyen plus facile de se rendre à http_params? Certes, la méthode ci-dessus fonctionne et est assez simple, mais je suis curieux de savoir s'il existe un moyen d'obtenir du hachage à la chaîne sans d'abord créer un tableau (le résultat de la méthode map)?

+1

Le vôtre est le même chemin que le mien. Ne pas oublier de faire un encodage correct sur les valeurs. –

Répondre

5

C'est probablement ce que vous pouvez faire de mieux. Vous pouvez itérer à travers les paires dans le hachage, la construction de la chaîne que vous allez. Mais dans ce cas, la chaîne intermédiaire devra être créée et supprimée à chaque étape.

Avez-vous un cas d'utilisation où il s'agit d'un goulot d'étranglement? En général, Ruby fait tellement de travail dans les coulisses que s'inquiéter d'un tableau temporaire comme celui-ci ne vaut probablement pas la peine. Si vous craignez que cela puisse poser un problème, envisagez de définir votre code pour la vitesse et l'utilisation de la mémoire, souvent les résultats ne sont pas ce que vous attendez.

+0

Non, je ne m'inquiète pas que ce soit un problème de performance - je suis encore relativement nouveau à ruby ​​et j'étais curieux de voir s'il y avait un moyen plus facile. Semble chaque fois que je commence à écrire une méthode, je trouve une méthode de ruby ​​ou de rails qui fait exactement la même chose (par exemple 'distance_de_temps_en_mots'). :) – jerhinesmith

8

De l'Le Guide du programmeur Pragmatique:

plusieurs paramètres passés à un rendement sont converties en un tableau si le bloc a un seul argument.

Par exemple:

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

Donc, votre code pourrait être simplifié comme celui-ci:

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

Je ne vois pas comment c'est plus simple. Si quelque chose, il cache l'intention du code derrière la magie "multiple parameters => array". – Ben

+0

Eh bien, c'est certainement une question de goût. * I * le trouve plus simple car il construit la chaîne sans avoir à traiter explicitement des clés et des valeurs. Je suis d'accord que c'est moins lisible, cependant. – Christian

9

Rails fournit la méthode to_query sur Hash classe. Essayez:

fields.to_query

+0

Nice! Ceci est exactement ce que je cherchais. – doug

Questions connexes