2011-10-28 17 views
5

में उपज का उपयोग करके लौटने और पुनरावर्तनीय संग्रह मेरे पास स्कैला में डेटटाइम और टाइमस्पेन क्लास है (मान लीजिए कि < और + ऑपरेटर काम करते हैं)। मैं एक 'रेंज' फ़ंक्शन को परिभाषित करने की कोशिश कर रहा हूं जो स्टार्ट/स्टॉप टाइम और स्टेपिंग के लिए एक टाइमपैन लेता है। सी # में मैं इसे उपज के साथ करता हूं, और मुझे लगता है कि मुझे स्कैला में ऐसा करने में सक्षम होना चाहिए ... सिवाय इसके कि मुझे एक अजीब त्रुटि मिल रही है।स्केल

'उपज टी' लाइन पर, मुझे "बयान की अवैध शुरुआत" मिलती है। 1) क्या मैं गलत क्या किया:

def dateRange(from : DateTime, to : DateTime, step : TimeSpan) = 
    { 
     // not sure what the list'y way of doing this is 
    var t = from 

    while(t < to) 
    { 
     yield t; // error: illegal start of statement 
     t = t + step 
    } 
    } 

इस कोड को देखते हुए, मैं 2 चीजों के बारे में उत्सुक हूँ? 2) लिखित कोड बहुत जरूरी है (एक var टी, आदि का उपयोग करता है)। स्कैला में ऐसा करने का अधिक कार्यात्मक तरीका क्या है जो उचित रूप से तेज़ है?

धन्यवाद!

+0

'स्काला में yield' जो भी कुछ भी नहीं' सी # (या अजगर) में yield' से कोई लेना देना नहीं है। इसके अलावा, स्कैला के बराबर इसके बराबर नहीं है - स्कैला, पायथन, उपज और जनरेटर के बारे में कई प्रश्न देखें। और, ज़ाहिर है, 'उपज' वास्तव में क्या करता है इसके बारे में प्रश्न देखें। –

+0

मैंने किया, और मैं उलझन में था। डेबिलस्की के जवाब ने मुझे उन सभी को बताया जो मुझे जानना था। – fbl

उत्तर

17
def dateRange(from : DateTime, to : DateTime, step : TimeSpan): Iterator[DateTime] = 
    Iterator.iterate(from)(_ + step).takeWhile(_ <= to) 
+0

अगर मैं आपको +1000 दे सकता हूं, तो मैं चाहता हूं। वह तो कमाल है। – fbl

0

स्कैला में, yield फॉर-लूप के लिए एक विशेष विवरण है।

मुझे सी # नहीं पता, लेकिन जो मैं समझता हूं, उससे मुझे लगता है कि आपके लिए सबसे आसान collection.immutable.NumericRange.Exclusive[DateTime] या collection.immutable.NumericRange.Inclusive[DateTime] का उपयोग करना है, इस पर निर्भर करता है कि आपका अंतराल अनन्य या समावेशी है या नहीं।

इसके लिए काम करने के लिए, आपको Integral[DateTime] का उदाहरण बनाना होगा जो DateTime टाइप करने के लिए अंकगणित को परिभाषित करता है।

+0

खैर, 'इंटीग्रल' ऐसा लगता है कि 'डेटटाइम' के लिए लागू करने के लिए बेवकूफ है। 'Iterator.iterate' के साथ अन्य दृष्टिकोण बहुत बेहतर है। –

3

यहाँ Joda समय अवधि के साथ @Debilski समाधान का एक संस्करण है:

import org.joda.time.{DateTime, Period} 

def dateRange(from: DateTime, to: DateTime, step: Period): Iterator[DateTime] = 
    Iterator.iterate(from)(_.plus(step)).takeWhile(!_.isAfter(to))