2012-11-11 12 views
5
scala> (1,5) == BigInt(12) /% 7 
res3: Boolean = true 

scala> BigInt(12) /% 7 match { 
| case (1,5) => true 
| } 

<console>:9: error: type mismatch; 
found : Int(1) 
required: scala.math.BigInt 
      case (1,5) => true 
       ^

क्या कोई शायद मुझे समझा सकता है कि यहां पैटर्न कैसे मिलान करें?स्कैला में पैटर्न मिलान

उत्तर

10

match समानता से अधिक विशिष्ट है; आप केवल बराबर नहीं हो सकते हैं, आपके पास एक ही प्रकार का होना चाहिए।

इस मामले में, BigInt एक केस क्लास नहीं है और उसके साथी ऑब्जेक्ट में unapply विधि नहीं है, इसलिए आप सीधे उस पर मेल नहीं खा सकते हैं। सबसे अच्छा तुम कर सकते हो

BigInt(12) /% 7 match { 
    case (a: BigInt,b: BigInt) if (a==1 && b==5) => true 
    case _ => false 
    } 

या किसी भिन्न रूप क्या है (उदाहरण के लिए case ab if (ab == (1,5)) =>) है।

वैकल्पिक रूप से, आप उचित प्रकार का एक unapply विधि के साथ एक वस्तु बना सकते हैं:

object IntBig { def unapply(b: BigInt) = Option(b.toInt) } 

scala> BigInt(12) /% 7 match { case (IntBig(1), IntBig(5)) => true; case _ => false } 
res1: Boolean = true 
+0

चर और बाध्य करने के लिए बाध्यकारी मैंने किया है। मैं बस इतना थका हुआ यह शायद थोड़ा बेहतर किया जा सकता है। धन्यवाद। – marcus

1

समस्या यह है कि 1 और 5/% द्वारा दिया BigInt रों हैं और इसलिए शाब्दिक Int है भले ही equals विधि (== द्वारा कहा जाता है) सच रिटर्न से मेल नहीं खाते है। यह काम करता है लेकिन थोड़ा सा सुरुचिपूर्ण है:

scala> BigInt(12) /% 7 match { case (x, y) if x == 1 && y == 5 => true } 
res3: Boolean = true 
2

1 और 5Int प्रकार हैं। पैटर्न मैच scala.math.BigInt की अपेक्षा कर रहा है। तो, इसे एक और पांच के लिए कुछ vals घोषित करके दें।

scala> val OneBig = BigInt(1) 
oneBig: scala.math.BigInt = 1 

scala> val FiveBig = BigInt(5) 
fiveBig: scala.math.BigInt = 5 

scala> BigInt(12) /% 7 match { 
    | case (OneBig, FiveBig) => true 
    | } 
res0: Boolean = true 
+3

यह काम नहीं करता है! पैटर्न में 'एक बिग' और 'पांच बिग' पहले परिभाषित किए गए लोगों से संबंधित नए चर हैं। इसे पूंजी पत्र ('वनबीग 'और' पांच बिग') के साथ या बैकटिक्स में नामों के आस-पास नाम देकर बदला जा सकता है। –

+0

धन्यवाद। इसके बारे में भूल गए। दिलचस्पी रखने वालों के लिए http://stackoverflow.com/questions/4479474/scala-pattern-matching-with-lowercase-variable-name या सीढ़ी पुस्तक के पृष्ठ 317 देखें। – Brian

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