रूबी में मैं बार-बार पाठ की एक लंबी स्ट्रिंग कैसे उत्पन्न करूं?


138

माणिक में एक लंबी स्ट्रिंग उत्पन्न करने का सबसे अच्छा तरीका क्या है? यह काम करता है, लेकिन बहुत धीमा है:

str = ""
length = 100000
(1..length).each {|i| str += "0"}

मैंने यह भी देखा है कि एक सभ्य लंबाई की एक स्ट्रिंग बनाना और फिर एक मौजूदा स्ट्रिंग को वांछित लंबाई तक जोड़ना बहुत तेजी से काम करता है:

str = ""
incrementor = ""
length = 100000
(1..1000).each {|i| incrementor += "0"}
(1..100).each {|i| str += incrementor}

कोई अन्य सुझाव?


1
सबसे अच्छा तरीका यह होगा कि आप JRuby का उपयोग करें और StringBuffer का उपयोग करें। Oooooh।
जोनाथन फीनबर्ग

जवाबों:


307
str = "0" * 999999

22
वास्तव में, बहुत अजीब, देखो कि पायथन में कितना अलग और सुरुचिपूर्ण दिखता है str = "0" * 999999;)
tokland

1
रूबी के साथ आदेश महत्वपूर्ण क्यों है? जब मुझे 99999 * "0"मिलता हैTypeError: String can't be coerced into Fixnum
स्टीवन

16
रूबी के दृष्टिकोण से @Steven, "0" * 999999के रूप में व्यवहार किया जाता है "0".*(999999), जहां *में एक विधि है Stringवर्ग। यह विधि स्ट्रिंग प्रतिकृति करने के लिए मान्य तर्कों के रूप में संख्याओं को स्वीकार करती है। जब आप अभिव्यक्ति को उल्टा करते हैं, तो हम प्राप्त करते हैं 999999.*("0")। अब हम कक्षा *में विधि के बारे में बात कर रहे हैं FixNum, और यह विधि तर्क के रूप में तार लेने से इनकार करती है। यह निश्चित रूप से (उदाहरण के लिए, स्वचालित रूप से एक FixNum को तर्क में परिवर्तित करने का सर्वोत्तम प्रयास कर सकता है), लेकिन भाषा डिजाइनरों ने रूबी के पेलिश प्रेरणाओं को पूरी तरह से गले लगाने के खिलाफ फैसला किया।
एफएमसी

11

एक और अपेक्षाकृत त्वरित विकल्प है

str = '%0999999d' % 0

हालांकि बेंचमार्किंग

require 'benchmark'
Benchmark.bm(9)  do |x|
  x.report('format  :') { '%099999999d' % 0 }
  x.report('multiply:') { '0' * 99999999 }
end

दिखाता है कि गुणा अब भी तेज है

               user     system      total        real
format  :  0.300000   0.080000   0.380000 (  0.405345)
multiply:  0.080000   0.080000   0.160000 (  0.172504)

मुझे यह उत्तर पसंद है, लेकिन मैं इसे '0' के अलावा किसी अन्य चीज़ के लिए काम करने के लिए नहीं कह सकता। अगर मुझे 100 r की चाह है तो मुझे क्या करना चाहिए?
yourdeveloperfriend

2
यह अन्य प्रतीकों के साथ काम नहीं करेगा क्योंकि यह प्रारूप स्ट्रिंग्स में नंबर पैडिंग का लाभ उठा रहा है। मान को बदले बिना नंबर 0 के सामने या पीछे (दशमलव के लिए) के साथ गद्देदार किए जा सकते हैं, आर इस तरह काम नहीं करते हैं।
एंड्रयू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.