स्कैला में unapply
और unapplySeq
दोनों क्यों हैं? दोनों के बीच क्या अंतर है? मुझे दूसरे पर कब पसंद करना चाहिए?अनुपयोगी और अनुपयोगी के बीच क्या अंतर है?
33
A
उत्तर
26
विवरण में जा रहा है और एक सा सरल बनाने के बिना:
object S {
def apply(a: A):S = ... // makes a S from an A
def unapply(s: S): Option[A] = ... // retrieve the A from the S
}
val s = S(a)
s match { case S(a) => a }
दोहराया पैरामीटर के लिए, apply
निर्माणों और unapplySeq
de-संरचनाओं: नियमित मापदंडों apply
निर्माणों और unapply
de-संरचनाओं के लिए
:
object M {
def apply(a: A*): M = ......... // makes a M from an As.
def unapplySeq(m: M): Option[Seq[A]] = ... // retrieve the As from the M
}
val m = M(a1, a2, a3)
m match { case M(a1, a2, a3) => ... }
m match { case M(a, as @ _*) => ... }
ध्यान दें कि उस दूसरे मामले में, दोहराए गए मानकों को Seq
और A*
और _*
के बीच समानता के समान माना जाता है।
तो यदि आप कुछ ऐसी चीजों को डि-स्ट्रक्चर करना चाहते हैं जो स्वाभाविक रूप से विभिन्न एकल मान हैं, तो unapply
का उपयोग करें। यदि आप Seq
वाले किसी चीज़ को डि-स्ट्रक्चर करना चाहते हैं, तो unapplySeq
का उपयोग करें।
18
फिक्स्ड-एरीटी बनाम परिवर्तनीय धैर्य। Pattern Matching in Scala (pdf) मिररिंग उदाहरणों के साथ, इसे अच्छी तरह से समझाता है। मेरे पास this answer में मिररिंग उदाहरण भी हैं।
संक्षेप में:
object Sorted {
def unapply(xs: Seq[Int]) =
if (xs == xs.sortWith(_ < _)) Some(xs) else None
}
object SortedSeq {
def unapplySeq(xs: Seq[Int]) =
if (xs == xs.sortWith(_ < _)) Some(xs) else None
}
scala> List(1,2,3,4) match { case Sorted(xs) => xs }
res0: Seq[Int] = List(1, 2, 3, 4)
scala> List(1,2,3,4) match { case SortedSeq(a, b, c, d) => List(a, b, c, d) }
res1: List[Int] = List(1, 2, 3, 4)
scala> List(1) match { case SortedSeq(a) => a }
res2: Int = 1
तो, जो आपको लगता है कि निम्न उदाहरण में प्रदर्शित किया जाता है?
scala> List(1) match { case List(x) => x }
res3: Int = 1
संबंधित मुद्दे
- 1. वेबड्राइवर-टेस्ट अनुपयोगी
- 2. htmlentities() चीनी अक्षरों को अनुपयोगी बनाता है
- 3. सबवर्जन रेपो अपग्रेड रिपोजिटरी अनुपयोगी बनाता है
- 4. पीएचपीएसटॉर्म दुर्घटनाग्रस्त होने के बाद अनुपयोगी
- 5. इकाई ढांचे और कई प्रश्नों के लिए कई अनुपयोगी?
- 6. मैवेन "प्रतीक नहीं ढूंढ सकता" संदेश अनुपयोगी
- 7. बनाम 2010 इतनी धीमी क्यों है? इसका लगभग अनुपयोगी
- 8. एंड्रॉइड ब्राउज़र टेक्स्टरेरा सभी जगहों पर स्क्रॉल करता है, अनुपयोगी
- 9. एंड्रॉइड एमुलेटर इतना धीमा है कि यह अनुपयोगी
- 10. अनुपयोगी setTimeout कॉल (तर्क-पीछे उद्धरण चिह्न अनुपलब्ध है?)
- 11. पीडीएफ अनुलग्नक अनुपयोगी डीएटी फाइलों में बदल रहे हैं
- 12. सक्रिय प्रोसेसर काउंटर और प्रोसेसर काउंटर के बीच क्या अंतर है?
- 13. # {} $ {} और% {} के बीच क्या अंतर है?
- 14. [अपरिभाषित] और [,] के बीच क्या अंतर है?
- 15. $ और $$ के बीच क्या अंतर है?
- 16. के बीच क्या अंतर है:। और: आर !?
- 17. भिन्नता और '-' के बीच क्या अंतर है?
- 18. "$^एन" और "$ +" के बीच क्या अंतर है?
- 19. क्या पाइथन जनरेटर ऑब्जेक्ट्स ट्रैवर्स होने के बाद "अनुपयोगी" बन जाते हैं?
- 20. के बीच क्या अंतर है?
- 21. अंतर और कहां के बीच क्या अंतर है?
- 22. क्या जेपीजी में जोड़ा गया यादृच्छिक डेटा इसे अनुपयोगी बना देगा?
- 23. file_get_contents और fread बीच क्या अंतर है
- 24. क्या बीच का अंतर है :: और ::: स्काला
- 25. "। +" और "। +?" के बीच अंतर
- 26. $ {} और # {} के बीच अंतर क्या हैं?
- 27. PHP के बीच क्या अंतर है और इसमें शामिल है?
- 28. अपवाद के .TOString() और मैसेज के बीच क्या अंतर है?
- 29. 7zip के 7z.sfx और 7zsd.sfx के बीच क्या अंतर है?
- 30. डीएल के फाइलवर्सन और उत्पादवर्जन के बीच क्या अंतर है?
आह धन्यवाद! यह समझ आता है। हास्केल परिप्रेक्ष्य से आ रहा है, मैं 'ए :: बी, सी :: नील' पर एक मैच में विलुप्त होने के रूप में 'सूची (ए, बी, सी)' से मेल खाने के बारे में सोचता हूं, लेकिन ऐसा लगता है कि स्कैला ऐसा नहीं करता है; इसके बजाय, यह 'सूची' की' unapplySeq' विधि का उपयोग करता है। –
इस उत्तर में उल्लिखित पेपर यहां पाया जा सकता है: http://www.michaelrueegg.name/static/papers/PatternMatchingInScala.pdf –
@ डैन स्कैला उन तरीकों से मेल खा सकता है जिन पर आप उम्मीद करते हैं, इस पर एक अप्रिय विधि होने के कारण: साथी साथी। जैसा कि उम्मीद है कि यह अनजाने में सूची (या बल्कि एक: :) में सिर और पूंछ में नष्ट हो जाता है। ध्यान दें कि यह केवल सूची के लिए काम करता है, किसी भी वर्ग के लिए नहीं। –