2012-06-28 11 views
7

मैं एकाधिक पैरामीटर केस क्लास के मिलान में उपयोग के लिए एक निकालने वाला (ओं) लिखने का प्रयास कर रहा हूं। सरलीकृत उदाहरण:स्कैला - निकालने वाला अपर्याप्त भ्रम

case class X(p1: String, p2: Int) 

मैं हर निकालने वस्तुओं चाहते हैं p1 के लिए एक निश्चित मूल्य को परिभाषित करने के लिए, और p2 उपयोग पर परिभाषित किया गया है। (ए, बी, आदि नहीं एक मामले वर्ग और उपवर्ग X हो सकता है, और मैं भी एक मामले के रूप में उपयोग करने के लिए एक्स (,) चाहते हैं) उदाहरण विधि लागू साथ:

object A { 
    def apply(p2: Int): X = X("A", p2) 
} 

object B { 
    def apply(p2: Int): X = X("B", p2) 
} 

... 

पैटर्न मिलान के लिए, मैं इस तरह से मिलान करने के लिए उन्हें चाहते हैं:

X("A", 2) match { 
    case A(2) => true // <- should match: p1="A" and p2=2 
    case A(_) => true // <- should match: p1="A" and p2=_ 
    case X("A", _) => true // <- should match: p1="A" and p2=_ 
    case A(1) => false // <- should not match 
    case B(2) => false // <- should not match: p1="B" and p2=2 
} 

मैं मैं A, B, आदि में unapply विधि परिभाषित करने की जरूरत है, लेकिन मैं अच्छी तरह से उलझन में क्या हस्ताक्षर और तर्क होना चाहिए हूँ:

object A { 
    def unapply(x: ???): Option[???] = { 
    ??? 
    } 
} 

सहायता, कृपया?

उत्तर

14

unapply कोई भी लेता है और जो भी आप निकालना चाहते हैं उसके Option लौटाता है। आपके मामले में यह होगा:

scala> case class X(p1: String, p2: Int) 
defined class X 

scala> object A { 
    | def unapply(target: Any): Option[Int] = 
    |  PartialFunction.condOpt(target) { 
    |  case X("A", p2) => p2 
    |  } 
    | } 
defined module A 

scala> val A(x) = X("A", 1) 
x: Int = 1 

scala> val A(x) = X("B", 1) 
scala.MatchError: X(B,1) (of class X) 
... 

लेकिन ईमानदारी से, उदाहरण के आप के साथ आया था A और B बिना फिर से लिखा जा सकता है:

X("A",2) match { 
    case X("A", 2) => true 
    case X("A", 1) => false 
    case X("A", _) => true 
    case X("B", 2) => false 
} 
+5

पहले उदाहरण में, मैं अक्सर PartialFunction का उपयोग '। एक अपरिवर्तनीय के डिफ़ॉल्ट मामले को लिखने से बचने के लिए condopt (यहां: 'PartialFunction.condOpt (लक्ष्य) {केस एक्स ("ए", पी 2) => कुछ (पी 2)} '; आप' PartialFunction._' भी आयात कर सकते हैं)। – Nicolas

+0

मुझे यह नहीं पता था। बहुत बढ़िया! –

+0

इतना आसान! धन्यवाद! बीटीडब्ल्यू मुझे पता है कि इस उदाहरण को लिखा जा सकता है, लेकिन यह उदाहरण सरलीकृत है। निकालने वालों का मुख्य उद्देश्य उन पैरामीटर संयोजनों को समाहित करना है जिन्हें आसानी से याद नहीं किया जाता है। – 7zark7

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