2014-09-19 8 views
5

इन दो समकक्ष क्यों हैं?क्यों (10..20) है। (10 ... 20) .last

(10..20).last  #=> 20 
(10...20).last #=> 20 

यह Ruby 'Range.last' does not give the last value. Why? का डुप्लिकेट की तरह लगता है, लेकिन है कि सवाल का जवाब बस कहना है कि यह डिजाइन द्वारा है। ऐसा क्यों बनाया गया है? .. और ... का उद्देश्य last के लिए समान मान लौटा रहा है जब सब कुछ अलग है?

+1

ठीक है, इसका उत्तर केवल राज्यों में है, यह डिज़ाइन द्वारा है। तो मेरा सवाल तब और मैं इसे ऊपर अपडेट कर दूंगा, यह डिज़ाइन द्वारा क्यों है? यह असंगत क्यों है? –

+1

यह असंगत नहीं है। अंत में सीमा में अंतिम वस्तु वापस। दोनों मामलों में सीमा की शुरुआत 10 है और अंतिम 20 है। जो आप वास्तव में चाहते हैं वह है (10 ... 20) .मैक्स # => 1 9 .last और .last (गणना) विभिन्न विधियां हैं और अलग व्यवहार करें। –

+1

1 से 3 तक संख्याओं का एक सेट बनाने के रूप में (1..3) के बारे में मत सोचें, इसे 1 से शुरू होने वाली रेंज ऑब्जेक्ट बनाने के रूप में सोचें, और समावेशी व्यवहार के साथ 3 पर समाप्त करें। फिर (1 ... 3) अंत में विशेष व्यवहार के साथ एक ही वस्तु है। दोनों के पास एक ही अंतिम मूल्य है, सिर्फ अलग व्यवहार है। –

उत्तर

7

मैं एक प्रश्न के साथ अपने प्रश्न का उत्तर दूंगा: 0.0...1.0 का अंतिम मूल्य क्या है?

सामान्य रूप से, not every Range is enumerable। एक सीमा के अंत के साथ ऐसी श्रेणियों के लिए, सीमा के अंत को परिभाषित करने के लिए उपयोग किए जाने वाले मूल्य की तुलना में वास्तव में कोई अर्थपूर्ण last मूल्य अन्य नहीं है। भी

ध्यान दें कि आप समावेशी पर्वतमाला की गणना कर सकते हैं जहां lastअंतिम मान प्रगणित नहीं है!

(0..3.2).to_a.last 
# 3 
(0..3.2).last 
# 3.2 
(0..Float::INFINITY).to_a.last 
# don't wait up for this one 

डिजाइन की प्रेरणा है कि "एक सीमा के अंत परिभाषित किया जाता मूल्य" "अंतिम मान एक सीमा से प्रगणित" के समान नहीं है। last आपको पूर्व देता है।

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