2012-05-18 5 views
9

मैं रेल 3.2.2 का उपयोग कर रहा हूं और मैं ' के साथ सभी सरणी तत्वों को उद्धृत करना चाहता हूं और उन सभी उद्धृत और अल्पविराम से अलग तत्वों वाली स्ट्रिंग को वापस करना चाहता हूं। इस समय मैंकोड को कैसे सुधारें जो '' `के साथ सभी सरणी तत्वों को उद्धृत करता है और उन सभी उद्धृत और अल्पविराम से अलग तत्वों वाली एक स्ट्रिंग देता है?

['a', 'b', 'c'].collect {|x| "'#{x}'"}.join(", ") 
# => "'a', 'b', 'c'" 

उपयोग कर रहा हूँ, लेकिन मुझे लगता है कि मैं ऊपर कोड सुधार कर सकते हैं (शायद रूबी विधि मेरे लिए एक अज्ञात का उपयोग करके, यदि वह मौजूद है)। क्या यह संभव है?

+3

जो आपने मेरे लिए अच्छा लगता है। –

+0

अनुकूलित करने के लिए कुछ भी नहीं है, bu आप उपनाम का उपयोग कर सकते हैं: 'संग्रह' के बजाय 'map' और 'join'' के बजाय' * 'यदि आप अपना कोड छोटा बनाने के लिए भूख से मर रहे हैं:'% w [abc] .map {| एक्स | "'# {x}'"} * ',' '। – jdoe

+2

क्या होता है यदि सरणी में स्ट्रिंग्स में से किसी एक में '' 'स्वयं होता है, उदा। '[" ए "," बीसीडी "]'? –

उत्तर

6

आप collect को इसके उपनाम map और .join के साथ समतुल्य * के साथ प्रतिस्थापित कर सकते हैं। अंत में, आप the shortcut for writing an array of strings, %w(...) का उपयोग कर सकते हैं, और आप .join/* के तर्क के लिए सिंगल कोट्स का उपयोग कर सकते हैं क्योंकि यह स्ट्रिंग इंटरपोलेशन का उपयोग नहीं करता है (हालांकि यह when it comes to performance बेहतर होने पर संदिग्ध हो सकता है)।

%w(a b c).map {|x| "'#{x}'"} * ', ' 

ऐसा प्रतीत होता है वहाँ लेकिन इस संस्करण और मूल के बीच कि Sigurd's version कि कोई प्रदर्शन अंतर बेहतर प्रदर्शन कर रहा है है:

बेंचमार्क के लिए
Original 3.620000 0.000000 3.620000 ( 3.632081) 
This 3.640000 0.000000 3.640000 ( 3.651763) 
Sigurd's 2.300000 0.000000 2.300000 ( 2.303195)

कोड:

require 'benchmark' 

n = 1000000 

Benchmark.bm do |x| 
    x.report("Original") { n.times do 
     ['a', 'b', 'c'].collect {|x| "'#{x}'"}.join(", ") 
    end} 
    x.report("This") { n.times do 
     %w(a b c).map {|x| "'#{x}'"} * ', ' 
    end} 
    x.report("Sigurd's") { n.times do 
     "'#{%w{a b c}.join("', '")}'" 
    end} 
end 
11

मैं

का उपयोग
"'#{%w{a b c}.join("', '")}'" 

यहां विस्तारित संस्करण है:

' # Starting quote 
%w{a b c}.join("', '") # Join array with ', ' delimiter that would give a', 'b', 'c 
' # Closing quote 
+0

ऐसा प्रतीत होता है [आपका संस्करण बेहतर प्रदर्शन करता है] (http://stackoverflow.com/a/14032344/789593)। –

+0

यहां क्यों है: सबसे पहले यह दो बार (मानचित्र और जुड़ने) के बजाय एक बार सरणी चलाता है। दूसरा, यह कम रूबी ऑब्जेक्ट बनाता है - वास्तविक परिणाम के लिए एक रैपर स्ट्रिंग और एक स्ट्रिंग एक परिणाम के रूप में। प्रारंभिक समाधान नक्शा परिणाम और सरणी में प्रत्येक तत्व के लिए नई स्ट्रिंग के लिए नई सरणी बनाता है। यह बड़ी सरणी पर खराब प्रदर्शन दिखा सकता है क्योंकि जीसी अधिक समय लेगा। – Sigurd

+0

आप यह समझाने के लिए अपने उत्तर में यह शामिल करना चाहेंगे कि आपका कोड बेहतर क्यों है। इसके अलावा, क्या आपका मतलब 'जीसी' के साथ कचरा संग्रह है? –