2012-01-11 10 views

उत्तर

44

कि सबसे आसान तरीका है downto

5.downto(1) do |i| puts i end 
+0

बहुत अच्छा, धन्यवाद डेरेक! – larryzhao

+2

और रूबी के आधुनिक संस्करणों में, आप 'x = 5.downto (1)' कर सकते हैं और एक चर के रूप में 'x' पास कर सकते हैं। –

+0

अच्छा। एक रेंज स्वचालित रूप से प्रत्येक इटरेटर के रूप में एक ब्लॉक को संभालती है। '.each' – ahnbizcad

20

सीमाओं <=> का उपयोग करता है, तो एक यात्रा खत्म हो गया है निर्धारित करने के लिए इस्तेमाल करते हैं; 5 <=> 1 == 1 (अधिक से अधिक), इसलिए यह शुरू होने से पहले किया जाता है। यहां तक ​​कि अगर वे नहीं करते हैं, तो succ का उपयोग करके पुनरावृत्त होते हैं; 5.succ6 है, अभी भी भाग्य से बाहर है। एक श्रेणी का step नकारात्मक नहीं हो सकता है, इसलिए यह काम नहीं करेगा।

यह रेंज देता है क्योंकि each इसे वापस कॉल किया जाता है। downto का उपयोग करें यदि यह वह कार्यक्षमता है जिसे आप ढूंढ रहे हैं, अन्यथा उपर्युक्त "क्यों" के बारे में आपके वास्तविक प्रश्न का उत्तर दें।

+0

बहुत अच्छी व्याख्या, अब मैं उन सभी को समझता हूं। – larryzhao

1

इसमें रूबी के साथ वास्तव में कुछ भी नहीं है, यह केवल साधारण मूल गणित है: 5 के साथ शुरू होने वाली सीमा और 1 के साथ समाप्त होता है। फिर से शुरू करने के लिए कुछ भी नहीं है।

+2

हां, लेकिन रुबी क्यों नहीं जाती "एक पल प्रतीक्षा करें, 1 5 से कम है, चलिए इसके बदले में जाएं"? –

+6

रूबी बहुत उपयोगकर्ता के अनुकूल है, इसलिए यह अपेक्षा करना उचित होगा कि यह काम करेगा। – ahnbizcad

+1

@AndrewGrimm: क्योंकि रुबी नहीं बता सकता है। रेंज प्रोटोकॉल की आवश्यकता नहीं है कि सही मान '<=>', केवल बाईं ओर जवाब देता है। –

0

क्योंकि रूबी केवल यही बताता है कि आपने क्या कहा है, न कि mean

यह नहीं बता सकता कि आप रिवर्स (यानी 5, 4, 3, 2, 1) में जाना चाहते हैं, या आप वास्तव में केवल 5 से शुरू होने वाली संख्या चाहते हैं जो 1 से कम या बराबर हैं। सैद्धांतिक रूप से संभव है कि कोई उत्तरार्द्ध चाहता है, और क्योंकि रुबी आप जो वास्तव में चाहते हैं उसे नहीं बता सकते हैं, यह बाद वाले के साथ जाएगा।

class Range 
    def each 
    if self.first < self.last 
     self.to_s=~(/\.\.\./) ? last = self.last-1 : last = self.last 
     self.first.upto(last) { |i| yield i} 
    else 
     self.to_s=~(/\.\.\./) ? last = self.last+1 : last = self.last 
     self.first.downto(last) { |i| yield i } 
    end 
    end 
end 

फिर, निम्नलिखित कोड के रूप में आप चाहते सिर्फ प्रदर्शन करेंगे:

+0

संख्या 5 से शुरू हो रही है जो 1 – Neeraj

+1

से कम या उसके बराबर होती है जो बहुत रचनात्मक नहीं थी। – Hamdan

+1

@ हमदान क्या आप समझा सकते हैं कि मेरा जवाब रचनात्मक क्यों नहीं है? मैं किसी को बेवकूफ़ नहीं कह रहा हूं, मैं बस यह समझा रहा हूं कि ओपी जिस तरह से उम्मीद करेगा, रूबी काम नहीं करेगा। –

3

आप आसानी से Range वर्ग का विस्तार कर सकते हैं, विशेष रूप प्रत्येक विधि में, यह दोनों आरोही और अवरोही सीमाओं के साथ संगत बनाने के लिए उम्मीद:

(0..10).each { |i| puts i} 
(0...10).each { |i| puts i} 
(10..0).each { |i| puts i} 
(10...0).each { |i| puts i} 
+1

अच्छी तरह से कोडित। इस दृष्टिकोण को लेने का जोखिम यह है कि आपके पास मौजूदा पुस्तकालय हो सकते हैं जिसमें प्रोग्रामर मानते हैं कि पिछली सीमा में कोई पुनरावृत्ति नहीं होगी, और इस परिवर्तन को करके आप उस धारणा को तोड़ सकते हैं और लाइब्रेरी के निष्पादन में त्रुटियों को पेश कर सकते हैं। कल्पना कीजिए कि बाएं और दाएं सीमाएं स्थिर फिक्सम के बजाय चर, एक्स और वाई द्वारा दर्शायी जाती हैं। ऐसे मामले में, प्रोग्रामर "सामान्य" श्रेणी व्यवहार पर निर्भर हो सकता है। रूबी में एक वर्ग बंदर-पैचिंग करते समय यह एक सामान्य जोखिम है। –

संबंधित मुद्दे