2009-12-01 15 views
9

Wenn ich einen Ruby-Hash in eine Kette von Name-Wert-Paaren umwandle (zum Beispiel in HTTP-Parametern), ist das der beste Weg?Einen Hash in eine Kette von Name/Wert-Paaren umwandeln

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

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

Ich denke, meine Frage ist:

Gibt es einen einfacheren Weg, um http_params zu bekommen? Zugegeben, der obige Weg funktioniert und ist ziemlich einfach, aber ich bin neugierig, ob es eine Möglichkeit gibt, vom Hash zum String zu kommen, ohne zuerst ein Array zu erstellen (das Ergebnis der map Methode)?

+1

Ihr ist der gleiche Weg wie meins. Vergessen Sie nicht, die Werte korrekt zu codieren. –

Antwort

5

Dies ist wahrscheinlich das Beste, was Sie tun können. Sie können die Paare im Hash durchlaufen und dabei die Zeichenfolge erstellen. Aber in diesem Fall müsste der Zwischenstring bei jedem Schritt erstellt und gelöscht werden.

Haben Sie einen Anwendungsfall, bei dem es sich um einen Leistungsengpass handelt? Im Allgemeinen macht Ruby so viel Arbeit hinter den Kulissen, dass sich die Sorge um ein temporäres Array wie dieses wahrscheinlich nicht lohnt. Wenn Sie befürchten, dass es sich um ein Problem handeln könnte, sollten Sie in Erwägung ziehen, Ihren Code für Geschwindigkeit und Speichernutzung zu profilieren. Die Ergebnisse entsprechen oft nicht Ihren Erwartungen.

+0

Nein, ich mache mir keine Sorgen darüber, dass es ein Performance-Problem ist - ich bin nur noch relativ neu in Ruby und war gespannt, ob es einen "leichteren" Weg gab. Scheint jedes Mal, wenn ich anfange, eine Methode zu schreiben, finde ich eine Rubin- oder Rails-Methode, die genau dasselbe macht (z. B. "distance_of_time_in_words"). :) – jerhinesmith

8

Vom Der Pragmatische Programmierer Guide:

Mehrere Parameter einer Ausbeute geben in ein Array umgewandelt werden, wenn der Block nur ein Argument hat.

Zum Beispiel:

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

So Ihr Code wie folgt vereinfacht werden:

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

Ich sehe nicht, wie das einfacher ist. Wenn überhaupt, verbirgt es die Absicht des Codes hinter der "multiple parameters => array" -Magie. – Ben

+0

Nun, es ist sicherlich eine Frage des Geschmacks. * Ich finde es einfacher, weil es die Zeichenkette konstruiert, ohne dass ich explizit mit Schlüsseln und Werten umgehen muss. Ich stimme zu, es ist jedoch weniger lesbar. – Christian

9

Rails bietet to_query Methode auf Hash Klasse. Versuchen Sie:

fields.to_query

+0

Schön! Genau das habe ich gesucht. – doug

Verwandte Themen