2010-09-25 13 views
20

मैं रूबी और पायथन जनरेटर (रूबी में Enumerators के रूप में जाना जाता है) के बीच समानता/अंतर का शोध कर रहा हूं, और जहां तक ​​मैं कह सकता हूं कि वे काफी समकक्ष हैं।रुबी जेनरेटर बनाम पायथन जनरेटर

हालांकि एक अंतर मैंने देखा है कि पायथन जेनरेटर close() विधि का समर्थन करते हैं जबकि रूबी जेनरेटर नहीं करते हैं। अजगर डॉक्स से close() पद्धति का अनुसरण करने के लिए कहा गया है:

बिंदु है जहां जनरेटर समारोह रोक दिया गया था पर एक GeneratorExit बढ़ा। जनरेटर समारोह तो StopIteration को जन्म देती है तो (सामान्य रूप से निकल कर, या पहले से ही बंद किया जा रहा के कारण) या GeneratorExit, अपने फोन करने वाले के पास रिटर्न (अपवाद को पकड़ने नहीं द्वारा)। "

वहाँ एक अच्छा कारण है कि रूबी Enumerators है close() विधि का समर्थन नहीं करते? या यह एक आकस्मिक चूक है?

मैं यह भी पता चला है कि रूबी Enumerators समर्थन एक rewind() विधि अभी तक अजगर जनरेटर नहीं है ... वहाँ यह भी?

लिए एक कारण है धन्यवाद

+0

उत्सुक, लेकिन मुझे समझ में नहीं आता कि आप इसका उपयोग कैसे करेंगे: क्या आप एक उदाहरण दे सकते हैं? –

+5

@ एंड्रयू विट: इसका उपयोग संसाधनों के लिए किया जा सकता है - डाटाबेस कनेक्शन, फाइल इत्यादि- जनरेटर द्वारा साफ किए जाने के लिए आयोजित किया जाता है।यह कोड के अन्य हिस्सों से अपने 'अगली' या 'प्रेषण' विधियों को और भी कॉल को रोक देगा। उदाहरण के लिए, आप 'करीबी' को कॉल कर सकते हैं, उदाहरण के लिए, कई उपभोक्ताओं में से किसी एक को इंगित करने के लिए कि वांछित मूल्य पाया गया है। – intuited

+0

@intuited, क्या पाइथन का 'करीबी() वास्तव में आमतौर पर उपयोग किया जाता है? मुझे लगता है कि मैंने कहीं पढ़ा है कि इसे पायथन समुदाय द्वारा 'आर्केन' माना जाता है और वास्तव में इसका उपयोग नहीं किया जाता है। – horseyguy

उत्तर

2

जेनरेटर स्टैक आधारित हैं, रूबी के अंकुशक अक्सर विशिष्ट (दुभाषिया स्तर पर) और ढेर पर आधारित नहीं हैं।

1

रूबी के गणनाकार के उपयोग StopIteration वर्ग आंतरिक रूप से, How do Enumerators work in Ruby 1.9.1?

देखते हैं (यह सिर्फ अगर आप प्रत्येक कॉल के लिए एक में उपयोग लिपटे है)। तो मैं कहूंगा कि वे एक करीबी हैं। ऐसा कहा जा रहा है, मुझे यकीन नहीं है कि एक गणक पर एक करीबी विधि करना चाहिए, बिल्कुल ... सफाई, शायद? (पाइथन के जनरेटर शायद रिवाइंड से लाभान्वित होंगे - ध्यान दें कि रुबी में, कुछ गणक रिवाइंड का जवाब नहीं देते हैं, इसलिए जब आप उस विधि को कॉल करते हैं तो वे अपवाद उठाते हैं)।

+2

आपके उत्तर के लिए धन्यवाद। लेकिन 'स्टॉपइटरेशन' क्या पाइथन भी उपयोग करता है - वास्तव में रूबी ने इस विचार को पायथन हेहे से लिया। जैसा कि एक 'करीबी() 'हो सकता है, मेरे प्रश्न (उपरोक्त) पर अंतर्दृष्टि की टिप्पणी देखें। – horseyguy

+0

हाँ रूबी 1.9.एक्स के अंकुशक ने मूल रूप से इसे पायथन के जेनरेटर के साथ लाया (हालांकि आप वास्तव में जनरेटर को अनुकरण करने के लिए रूबी में एक ब्लॉक का उपयोग भी कर सकते हैं)। – rogerdpack

6

यह documentation for the rewind method विवरण पर थोड़ा सा दुर्लभ है।

  • अपनी पूर्ण उत्पादन याद है, दोहराने कि उत्पादन एक बार rewound, तो फिर से शुरू यह क्या कर रहा था इससे पहले कि
  • अपनी आंतरिक स्थिति को रीसेट: लेकिन क्रम में "से शुरू" में जनरेटर करने के लिए दो में से एक होता है इस तरह से एक ही आउटपुट को अन्य अवांछित दुष्प्रभावों के बिना दोहराया जा सकता है

इनमें से दूसरा हमेशा संभव नहीं होता है; उदाहरण के लिए, यदि जनरेटर नेटवर्क से बाइट बफर उत्सर्जित करता है, तो आउटपुट पूरी तरह आंतरिक स्थिति का कार्य नहीं होता है। लेकिन किसी भी जनरेटर जो पहली तकनीक का उपयोग करता है, उसे स्मृति में एक बड़े और बड़े बफर को जरूरी रूप से उपयोग करना चाहिए। ऐसे जनरेटर सूचियों पर थोड़ा प्रदर्शन लाभ प्रदान करते हैं।

इसलिए, मैंने निष्कर्ष निकाला है कि रूबी rewind विधि वैकल्पिक होना चाहिए और हमेशा एक ठोस गणनाकर्ता वर्ग द्वारा समर्थित नहीं होना चाहिए। तो यदि पाइथन डिजाइनर Liskov substitution principle मानते हैं, तो इससे उन्हें सभी जेनरेटर में ऐसी विधि की आवश्यकता नहीं होगी।