2010-05-28 8 views
14

का उपयोग कर रूबी में लूपिंग मतभेद मैं रुबी का उपयोग करके एक परियोजना यूलर समस्या को हल करने की कोशिश कर रहा हूं, मैंने 4 अलग-अलग लूपिंग विधियों, फॉर-लूप, समय, रेंज और विधि तक उपयोग किया, हालांकि समय विधि केवल उत्पादन करती है अपेक्षित उत्तर, जबकि फॉर-लूप, रेंज और विधि तक नहीं है। मुझे लगता है कि वे कुछ हद तक समान हैं, लेकिन मुझे पता चला कि यह नहीं है। क्या कोई इन तरीकों के बीच मतभेदों को समझा सकता है?रेंज बनाम टाइम्स

यहाँ पाशन संरचना मैं

# for-loop method 
for n in 0..1 
    puts n 
end 

0 
1 
=> 0..1 

# times method 
2.times do |n| 
    puts n 
end 

0 
1 
=> 2 

# range method 
(0..1).each do |n| 
    puts n 
end 

0 
1 
=> 0..1 

# upto method 
0.upto(1) do |n| 
    puts n 
end 

0 
1 
=> 0 

उत्तर

6

इस्तेमाल किया यह जानकारी आसानी से प्रलेखन निरीक्षण से प्राप्त किया जा सकता है।

Array#eacharray.each {|item| block } → array के हस्ताक्षर हैं, तो हम देख सकते हैं कि foo.each { ... } के रिटर्न मान foo है।

इसी प्रकार, Int#upto में int.upto(limit) {|i| block } => int का हस्ताक्षर है, इसलिए x.upto(y) { ... } हमेशा x लौटाएगा।

फिर हम यह भी देख सकते हैं कि 2.times { ... }Integer#times के हस्ताक्षर के कारण 2 वापस आ जाएगा।

मैं मुसीबत सही प्रलेखन ढूंढ़ कर रही है, लेकिन for x in y...y.each do |x| ... में अनुवाद किया जाता है, तो यह है कि यही कारण है कि अपने लिए में पाश अपने .each लूप के रूप में एक ही बात रिटर्न है।

वैसे भी, पर निर्भर करता है इन लूपिंग संरचनाओं के मान ... एक अजीब दृष्टिकोण है। मुझे नहीं लगता कि यह मूर्खतापूर्ण रूबी कोड में बहुत कुछ होता है (बिल्कुल?)।

+0

यह मेरे लिए अच्छा नहीं है जैसे वह वापसी मूल्य के बारे में पूछ रहा है। – sepp2k

+0

@ sepp2k: मैंने देखा कि प्रत्येक कथन का * आउटपुट * '0 1' था, जबकि' => 'द्वारा दर्शाए गए रिटर्न मानों में 3 अलग-अलग मान थे। सवाल किसी भी मामले में, अधिक स्पष्ट रूप से कहा जा सकता था। –

+0

एचएम, आप शायद सही हैं। – sepp2k

3

यदि मैं आपको सही ढंग से समझता हूं, तो आप पूछ रहे हैं कि क्यों n.times एकमात्र तरीका है जो n सहित नहीं है। उस स्थिति में:

श्रेणियों के लिए यह आसान है: x..y एक्स से वाई समावेशी और x...y से एक सीमा को परिभाषित करता है x से y अनन्य तक एक सीमा को परिभाषित करता है। तो यदि आप 0...n का उपयोग करते समय समान व्यवहार चाहते हैं।

x.upto(y) के लिए केवल एक संस्करण है जो y तक जारी होगा और इसमें शामिल होगा। यह बस काम करने के लिए परिभाषित और दस्तावेज कैसे किया जाता है।

यह भी स्पष्ट है कि n.times में एन शामिल नहीं है: यदि यह 0 से एन (समावेशी) से पुनरावृत्त होता है, तो यह n+1 बार उत्पन्न करेगा। लेकिन चूंकि विधि को n.times कहा जाता है, इसलिए इसे स्पष्ट रूप से केवल n बार उत्पन्न करना चाहिए।