यदि आप मेरे जैसे हैं, तो आप कभी-कभी स्कैला संग्रह या अनुक्रमों के लिए उन्नत विधियां लिखना चाहते हैं, लेकिन आप संग्रह प्रकार के साथ-साथ तत्व प्रकार को बाध्य करना चाहते हैं, न कि केवल Seq [T] तक।आप जेनेरिक स्कैला एन्हांसमेंट विधियों को कैसे लिख सकते हैं जो संग्रहण प्रकार के साथ-साथ तत्व प्रकार को बाध्य करते हैं?
6
A
उत्तर
7
यह करने के लिए एक तरीका होता है, और यह इस तरह काम करता है:
object enhance {
import scala.language.higherKinds
import scala.language.implicitConversions
import scala.collection.SeqLike
import scala.collection.generic.CanBuildFrom
implicit class Enhance[T, S[E] <: SeqLike[E, S[E]]](seq: S[T]) {
def first3(implicit cbf: CanBuildFrom[S[T], T, S[T]]) = seq.take(3)
def foo = seq.iterator
def goo(implicit cbf: CanBuildFrom[Nothing, T, S[T]]) = foo.take(3).to[S]
def moo[U](f: T => U)(implicit cbf: CanBuildFrom[S[T], U, S[U]]) = seq.map(f)
}
}
ऊपर प्रकार हस्ताक्षर पैटर्न का उपयोग करना, बढ़ाया तरीकों दोनों तत्व प्रकार के बारे में पता कर रहे हैं T
(Int
जैसे या String
) और उच्च-प्रकार वाले अनुक्रम प्रकार S
(उदाहरण के लिए List
या Vector
) और इसलिए यह ठीक उसी अनुक्रम प्रकार को वापस कर सकता है जिसे इसे कॉल किया गया था।
कई अनुक्रम विधियों को CanBuildFrom
प्रत्यारोपण की आवश्यकता हो सकती है, जो Enhance
विधियों को अंतर्निहित पैरामीटर के रूप में जोड़ा जाता है, जहां उन्हें ऊपर दिए गए उदाहरणों में आवश्यकता होती है।
के बाद, एक नमूना रन है वांछित उच्च kinded संग्रह वापसी प्रकार दिखा:
scala> import enhance._
import enhance._
scala> (1 to 10).toList.first3
res0: List[Int] = List(1, 2, 3)
scala> (1 to 10).toVector.first3
res1: Vector[Int] = Vector(1, 2, 3)
scala> (1 to 10).toList.goo
res2: List[Int] = List(1, 2, 3)
scala> (1 to 10).toVector.goo
res3: Vector[Int] = Vector(1, 2, 3)
scala> (1 to 10).toList.moo(_.toDouble)
res4: List[Double] = List(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0)
scala> (1 to 10).toVector.moo(_.toDouble)
res5: Vector[Double] = Vector(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0)
संबंधित मुद्दे
- 1. आप जेनेरिक के लिए डिफ़ॉल्ट प्रकार कैसे प्रदान करते हैं?
- 2. आप मैप किए गए प्रकार को कैसे बना सकते हैं जो टुपल प्रकार है?
- 3. आप पाइथन में फ़ाइल प्रकार को कैसे उपclass करते हैं?
- 4. स्कैला: जेनेरिक क्लास प्रकार
- 5. वीएस इंटेलिजेंस: क्या आप एक्सटेंशन विधियों को छुपा सकते हैं?
- 6. जेनेरिक प्रकार को
- 7. सामान्य गुण हैं जो सरणी को स्वीकार्य कर सकते हैं?
- 8. क्या हम स्कैला में उच्च-प्रकार के प्रकार-स्तरीय पहचान फ़ंक्शन को परिभाषित कर सकते हैं?
- 9. स्कैला में फ़ंक्शन के लिए आप किस प्रकार को परिभाषित करते हैं?
- 10. आप स्कैला ग्रहण प्लगइन को कैसे अनइंस्टॉल करते हैं?
- 11. Xml क्रमबद्धता प्रकार का ऑब्जेक्ट नहीं लिख सकते हैं 'एक्स'
- 12. आप जंग में कस्टम 'त्रुटि` प्रकार कैसे परिभाषित करते हैं?
- 13. क्या आप [पीसी] पर लिख सकते हैं?
- 14. आप कार्यात्मक निर्भरताओं के साथ एक प्रकार के वर्ग से आश्रित प्रकार कैसे प्राप्त करते हैं और उपयोग करते हैं?
- 15. नेस्टेड प्रकार जो सार्वजनिक हैं
- 16. आप जावा से स्कैला ऑब्जेक्ट्स को कैसे कॉल करते हैं?
- 17. क्या आप एक प्रकार के वर्ग बाध्य पैरामीटर पर पैटर्न सेक्टर बना सकते हैं?
- 18. आप पाइथन में एक प्रकार का उपनाम कैसे करते हैं?
- 19. स्कैला जेनेरिक प्रकार से कैसे मिलान करें?
- 20. हम स्कैला में maven2 प्लगइन कैसे लिख सकते हैं?
- 21. जावा: आप एक सामान्य प्रकार में निर्दिष्ट जेनेरिक प्रकार के समान होने के लिए कक्षा प्रकार पैरामीटर को कैसे लागू करते हैं?
- 22. आप विस्तार विधियों को सीधे क्यों नहीं बुला सकते हैं?
- 23. आप कैनकन क्षमता कैसे लिख सकते हैं? और एचबीटीएम रिलेशनशिप के संदर्भ में दोनों कामों को सुलभ कर सकते हैं?
- 24. जेनेरिक प्रकार
- 25. स्कैला में टुपल्स के लिए जेनेरिक गेटर विधि जो गतिशील प्रकार को संरक्षित करती है?
- 26. आप UIElement के अभिभावक को कैसे प्राप्त कर सकते हैं?
- 27. आप JVM को कैसे क्रैश करते हैं?
- 28. आप सीमित प्रकार के टाइप किए गए एक खुले खुले जेनेरिक क्यों नहीं डाल सकते हैं?
- 29. क्या आप एबीसीएल के साथ जावा क्लास लिख सकते हैं?
- 30. जेनेरिक प्रकार
इसके अलावा, आप 'के रूप में निहित वर्ग संशोधन [टी, एस [ई] <वर्ग को परिभाषित कर सकते हैं: IterableLike [ई, एस [ई]]] (सीईसी: एस [टी]) {'और फिर आपको 'asInstanceOf' –
की आवश्यकता नहीं होगी यदि आप' मानचित्र 'या किसी अन्य विधि का उपयोग करते हैं जो नई विधि में' CanBuildFrom' लेता है तो यह काम नहीं करेगा कार्यान्वयन। नतीजा सिर्फ 'सेक' के रूप में सामने आएगा। आपको 'Enhance' कक्षा या विधि में प्रासंगिक अंतर्निहित' CanBuildFrom' पास करने की आवश्यकता होगी। – Kolmar
धन्यवाद @ НиколайМитропольский और कोलमार, दोनों संशोधन बहुत उपयोगी हैं! मैंने उन्हें अपने मूल जवाब को क्रिया में दिखाने के लिए फिर से काम किया। – eje