2012-07-13 8 views
7

एक गहरे लाल रंग का रेंज वस्तु में ट्रिपल डॉट नोटेशन का उपयोग कर, मैं इस मिल:रूबी 'रेंज.स्टास्ट' अंतिम मूल्य नहीं देता है। क्यूं कर?

(0...5).each{|n| p n} 
0 
1 
2 
3 
4 

जब मैं 'अंतिम' विधि का उपयोग मैं:

(0...5).last 
=> 5 

मैं अपेक्षा की होगी 4

क्या यह एक बग है? या क्या कोई ऐसी चीज है जिसे मैं रेंज ऑब्जेक्ट की अवधारणा के बारे में नहीं समझता?

+1

यहाँ आप रेंज वस्तुओं के बारे में समझ में नहीं कर रहे हैं: पर विचार रेंज 'मठ :: ई ... मठ :: पीआई'। 'आखिरी' क्या होना चाहिए? रेंज सचमुच सिर्फ एक शुरुआत, अंत है, और अंत को बाहर रखा गया है या नहीं। तथ्य यह है कि पूर्णांक सीमाओं पर गणना की जा सकती है एक विशेष विशेषता है। रेंज के कई अन्य उपयोग हैं। – Max

+0

रेंज के लिए 'अंत' विधि है, मैंने दबाया। हालांकि मुझे 'स्टार्ट' विधि याद आ रही है। – Rempargo

उत्तर

11

यह डिज़ाइन द्वारा है। रूबी 2.0 प्रलेखन more specific है:

ध्यान दें कि कोई तर्क के साथ last उद्देश्य यह है कि सीमा भले ही exclude_end?true है के अंत परिभाषित करता है वापस आ जाएगी।

(10..20).last  #=> 20 
(10...20).last  #=> 20 
(10..20).last(3) #=> [18, 19, 20] 
(10...20).last(3) #=> [17, 18, 19] 
1

स्टीफन के रूप में उत्तर दिया है अपने मनाया अपेक्षित व्यवहार और प्रलेखित है।

आप पिछले तत्व जो पूरी श्रृंखला की गणना करने में बिना सीमा के आधार पर गणना की जाएगी प्राप्त करने के लिए चाहते हैं, आप इस्तेमाल कर सकते हैं Enumerable#reverse_each

irb> (0...5).reverse_each.first 
=> 4 
+0

'reverse_each.first' * * पूरे रेंज – Stefan

+1

या शायद' (0 ... 5) .max' –

+0

@Stefan आप पूरी तरह से सही हैं। मुझे नहीं पता कि मैं क्या सोच रहा था - गणित के वर्ग के विपरीत गणित के बारे में विशेष ज्ञान कैसे हो सकता है। – dbenhur

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