2014-10-25 4 views
10

स्कैला में उपज/उपज के लिए मानक प्रारूप यहां दिया गया है: ध्यान दें कि यह एक संग्रह की अपेक्षा करता है - जिसका तत्व पुनरावृत्ति चलाता है।स्केल में उपज के साथ थोड़ी देर लूप का उपयोग किया जा सकता है

for (blah <- blahs) yield someThingDependentOnBlah 

मैं एक स्थिति है जहाँ पुनरावृत्तियों की एक अनिश्चित संख्या एक पाश में हो जाएगा है। आंतरिक पाश तर्क निर्धारित करता है कि कितने निष्पादित किए जाएंगे।

while (condition) { some logic that affects the triggering condition } yield blah 

प्रत्येक पुनरावृत्ति अनुक्रम का एक तत्व उत्पन्न करेगा - जैसे उपज को प्रोग्राम करने के लिए प्रोग्राम किया जाता है। ऐसा करने के लिए एक अनुशंसित तरीका क्या है?

+0

से प्राकृतिक लगता है इस तरह के अस्पष्ट है। 'के लिए ... उपज' नक्शा एक अपरिवर्तनीय संरचना के लिए एक अपरिवर्तनीय संरचना है, लेकिन आमतौर पर कुछ म्यूटेबल राज्य में हेरफेर करने के लिए 'जबकि' का उपयोग किया जाता है, इसलिए स्पष्ट 'उपज' एनालॉग नहीं होता है। क्या आप वास्तव में क्या करने की कोशिश कर रहे हैं इसके बारे में अधिक जानकारी प्रदान कर सकते हैं? –

उत्तर

16

आप

Iterator.continually{ some logic; blah }.takeWhile(condition) 

काफी एक ही बात प्राप्त करने के लिए कर सकते हैं। स्थिति को प्रभावित करने के लिए आपको तर्क के लिए कुछ म्यूटेबल (उदा। एक var) का उपयोग करने की आवश्यकता होगी। नहीं तो आप कर सकते हैं

Iterator.iterate((blah, whatever)){ case (_,w) => (blah, some logic on w) }. 
     takeWhile(condition on _._2). 
     map(_._1) 
+0

धन्यवाद यह – javadba

+0

@RexKerr के बारे में जो कुछ मैं देख रहा था उसकी भावना को शामिल करता है जबकि कुछ समय के बारे में कैसे? – Sohaib

+1

@ सोहाइब - इटरेटर्स अपने मौजूदा तरीकों के सेट के साथ अजीब बनाते हैं। हालांकि, आप हमेशा एक तत्व कैश कर सकते हैं। –

2

समझ के लिए उपयोग करना इसके लिए गलत बात है। आप जो वर्णन करते हैं वह आमतौर पर unfold द्वारा किया जाता है, हालांकि यह विधि स्कैला की मानक लाइब्रेरी में मौजूद नहीं है। हालांकि, आप इसे स्कालाज़ में पा सकते हैं।

+0

ठीक है। मैं सिर्फ एक सामान्य किया जबकि पाश और के अंदर यह एक ArrayBuffer – javadba

+1

स्काला मानक संग्रह उन में बहुत बड़ा कार्यक्षमता छेद है के साथ जोड़ दिया .. लेकिन scalaz का उपयोग करने जा @matanster कि का उपयोग करते हुए कह रही है की तरह है हम में से बाकी के लिए एक छोटे से कट्टरपंथी है ... – matanster

+1

अपाचे कॉमन्स थोड़ा कट्टरपंथी है। _all_ अपाचे कॉमन्स का उपयोग करना कट्टरपंथी हो सकता है, लेकिन, कहें, कॉमन्स-लैंग ठीक है। ऐसा ही होता है कि स्कालज़ इसमें सबकुछ के साथ आता है, लेकिन आप इसका उपयोग कर सकते हैं, उदाहरण के लिए, 'unfold'। –

-1

एक और तरीका है @rexkerr द्वारा सुझाव के समान:

blahs.toIterator.map{ do something }.takeWhile(condition) 

यह थोड़ा अधिक Iterator.continually

+0

जो भी डाउनवॉटेड (टिप्पणियों के बिना) - इसके लिए धन्यवाद। मैं विभिन्न कार्यक्रमों में इस निर्माण का उपयोग कर रहा हूं और ओपी के इरादे को प्राप्त करते समय यह अतिरिक्त अप्रयुक्त मूल्यों को सही ढंग से टालने से बचाता है। – javadba

+0

क्या आप उदाहरण के साथ समझा सकते हैं? – Kaushal

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