एक नया वर्ग है कि समझ के लिए एक स्काला में इस्तेमाल किया जा सकता बनाने के लिए, ऐसा लगता है तुम सब करने की है एक नक्शे के समारोह को परिभाषित है कि:स्केल में लूप के लिए पैटर्न मिलान के लिए फ़िल्टर को क्यों परिभाषित किया जाना चाहिए?
scala> class C[T](items: T*) {
| def map[U](f: (T) => U) = this.items.map(f)
| }
defined class C
scala> for (x <- new C(1 -> 2, 3 -> 4)) yield x
res0: Seq[(Int, Int)] = ArrayBuffer((1,2), (3,4))
लेकिन केवल छोरों के लिए आसान के लिए काम करता है कि जहां कोई <-
के बाईं ओर पैटर्न मिलान। तुम वहाँ पैटर्न मैच करने की कोशिश करते हैं, तो आप एक शिकायत है कि filter
विधि से परिभाषित नहीं है मिलती है:
scala> for ((k, v) <- new C(1 -> 2, 3 -> 4)) yield k -> v
<console>:7: error: value filter is not a member of C[(Int, Int)]
for ((k, v) <- new C(1 -> 2, 3 -> 4)) yield k -> v
क्यों फिल्टर यहां मिलान पैटर्न लागू करने के लिए आवश्यक है? मैंने सोचा था कि होता है स्काला सिर्फ बराबर map
कॉल में ऊपर पाश अनुवाद होगा:
scala> new C(1 -> 2, 3 -> 4).map{case (k, v) => k -> v}
res2: Seq[(Int, Int)] = ArrayBuffer((1,2), (3,4))
लेकिन वह ठीक से काम करने लगता है, तो पाश के लिए कुछ और ही में अनुवाद किया जाना चाहिए। इसका अनुवाद क्या है filter
विधि की आवश्यकता है?
मैंने संकलित कोड को '5' के साथ और बिना चेक किया। जब कोई '5' नहीं होता है, तो फ़िल्टर का उपयोग नहीं किया जाता है। – IttayD
वाह, मुझे कभी एहसास नहीं हुआ कि लूप के लिए चुपचाप गैर मेल खाने वाले आइटम फेंक देंगे। यह एक सूक्ष्म गोचा की तरह लगता है मैं बेहतर देखने के लिए बाहर देखो। – Steve
'मानचित्र' संस्करण लगभग खतरनाक है, क्योंकि इसमें कोई चेतावनी नहीं है कि यह फेंक सकता है। दुर्भाग्यवश, आंशिक फ़ंक्शन का उपयोग किए बिना फ़ंक्शन शाब्दिक में तर्कों को नष्ट करने के लिए वर्तमान में कोई वाक्यविन्यास नहीं है। –