2011-10-31 17 views
18

क्या स्केल में if के अंदर स्थितियों के बारे में समझ के लिए स्केल में यह संभव है? मैं की तर्ज पर सोच रहा हूँ:स्कैला की समझ के लिए `if` कथन

val collection: SomeGenericCollection[Int] = ... 

trait CollectionFilter 
case object Even extends CollectionFilter 
case object Odd extends CollectionFilter 

val evenColl = for { i <- collection if(Even) } yield i 
//evenColl would be a SomeGenericEvenCollection instance 

val oddColl = for { i <- collection if(Odd) } yield i 
//oddColl would be a SomeGenericOddCollection instance 

सार है कि i उपज से, मैं एक संभावित रूप से विभिन्न प्रकार के (इसलिए मुझे के रूप में "विशेषज्ञता" इसे करने के लिए चर्चा करते हुए) का एक नया संग्रह मिलता है - करने के लिए विरोध के रूप में बस एक ही जेनेरिक कोलेक्शन प्रकार का एक फ़िल्टर-डाउन संस्करण।

कारण मैं पूछता हूं कि मैंने ऐसा कुछ देखा जो मुझे नहीं पता था (उदाहरण के लिए on line 33 of this ScalaQuery example पाया जा सकता है। यह क्या करता है डेटाबेस (यानी SELECT ... FROM ... WHERE ...) के लिए एक क्वेरी बनाते हैं, जहां मैं इसे उम्मीद करता । ने कहा कि पूछताछ के परिणामों से अधिक पुनरावृति

+0

यह प्रश्न अधिक समझ में नहीं आता है। मैं जो जवाब देता हूं उसका जवाब देने जा रहा हूं, लेकिन इसे सुधारने की कोशिश करें। –

+0

['अभिव्यक्तियों के लिए]] (http://www.artima.com/pins1ed/for-expressions-revisited.html#23.1) मदद करनी चाहिए। – 4e6

+0

मैंने प्रश्न को स्पष्ट करने की कोशिश करने के लिए थोड़ा सा जोड़ा, हालांकि आप जो पूछ रहे थे उसके बारे में आपकी सोच में सही साबित हुए। – Dylan

उत्तर

40

तो, मुझे लगता है कि आप पूछ रहे हैं कि परिणाम प्रकार बदलने के लिए if कथन के लिए यह संभव है या नहीं। जवाब है "हाँ, लेकिन। .. "।

सबसे पहले, समझें कि समझ के लिए कैसे विस्तार किया जाता है। यहां स्टैक ओवरफ्लो पर चर्चा करने वाले प्रश्न हैं, और ऐसे पैरामीटर हैं जिन्हें आप कंपाइलर को पास कर सकते हैं ताकि यह आपको दिखाएगा कि क्या हो रहा है।

वैसे भी, इस कोड: - इस सरल मामले में

val evenColl = collection.withFilter(i => Even).map(i => i) 

तो, withFilter विधि को परिवर्तित करता है संग्रह प्रकार, यह तुम क्या चाहते हो जाएगा:

val evenColl = for { i <- collection if(Even) } yield i 

रूप में अनुवाद किया है । अधिक जटिल मामलों को, कि अकेले काम नहीं करेगा:

for { 
    x <- xs 
    y <- ys 
    if cond 
} yield (x, y) 

रूप

xs.flatMap(ys.withFilter(y => cond).map(y => (x, y))) 

जो मामले flatMap तय करना है कि किस प्रकार वापस कर दी जाएगी अनुवाद किया है। यदि यह परिणाम लौटाए जाने से क्यू लेता है, तो यह काम कर सकता है।

अब, स्कैला संग्रह पर, के साथ फ़िल्टर संग्रह के प्रकार को नहीं बदलता है। आप अपनी खुद की कक्षाएं लिख सकते हैं जो ऐसा करेंगे।

+0

धन्यवाद- मुझे लगता है कि 'withFilter' वह महत्वपूर्ण जानकारी थी जिसे मैं याद कर रहा था। – Dylan

4

हाँ आप कर सकते हैं -।। this tutorial के लिए एक आसान उदाहरण के लिए देखें स्केला क्वेरी उदाहरण आप उद्धृत भी संग्रह पर पुनरावृत्ति है, यह तो उपयोग कर रहा है कि डेटा क्वेरी बनाने के लिए

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