2009-12-01 20 views
9

Bir ruby ​​hash değerini bir ad-değer çiftleri dizesine çevirirseniz (örneğin, HTTP paramlarında kullanılmak üzere), bu en iyi yol mu?Karma değeri ad-değer çiftleri dizesinin içine çevirme

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

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

benim soru şu:

http_params almak için daha kolay bir yolu var mı? Verilen, yukarıdaki yol çalışır ve oldukça basit, ama ben bir dizi oluşturmadan (map yönteminin sonucu) dizeden karma çıkarmak için bir yolu varsa merak ediyorum?

+1

. Değerlerde doğru kodlamayı yapmayı unutmayın. –

cevap

5

Muhtemelen yapabileceğiniz en iyi şey budur. Eserindeki çiftleri tekrarlayarak, dize dizini yaparak devam edebilirsiniz. Ancak bu durumda ara dizginin her adımda oluşturulması ve silinmesi gerekecektir.

Bunun bir performans darboğaz olduğu bir kullanım durumunuz var mı? Genel olarak Ruby, bu tür geçici bir dizi hakkında endişelenen sahnelerin arkasında çok fazla iş yapıyor, muhtemelen buna değmez. Bir sorun olabileceğinden endişe ediyorsanız, kodunuzun hız ve bellek kullanımı için profil oluşturmayı düşünün, genellikle sonuçlar beklediğiniz gibi değildir.

+0

Hayır, bir performans sorunu olmaktan dolayı endişelenmiyorum - Ben hala yakut için nispeten yeni ve 'kolay' bir yol olup olmadığını merak ettim. Bir yöntem yazmaya başladığım her zaman, aynı şeyi yapan bir yakut veya ray yöntemi buluyorum (örn. 'Distance_of_time_in_words'). :) – jerhinesmith

8

itibaren Pragmatik Programcı Kılavuzu: blok sadece bir argüman varsa bir verim geçirilen

Birden çok parametre bir diziye dönüştürülür. Örneğin

:

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

Yani kod aşağıdaki gibi basitleştirilmiş olabilir:

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

Bunun nasıl daha basit olduğunu göremiyorum. Bir şey varsa, "çoklu parametreler => dizi" sihri arkasındaki kodun niyetini gizler. – Ben

+0

Evet, kesinlikle bir tat meselesi. * Ben * daha basit buluyorum, çünkü anahtarlar ve değerler ile açık bir şekilde uğraşmak zorunda kalmadan dizeyi inşa ediyor. Yine de daha az okunabilir olduğunu kabul ediyorum. – Christian

9

Raylar Hash sınıfına to_query yöntem sağlar. Deneyin: Sevgiler benim gibi aynı şekilde

fields.to_query

+0

Güzel! Tam olarak aradığım şey bu. – doug