2012-08-14 24 views
7

This great daily Scala article मिलान के साथ मिलान करने वाले स्केल पैटर्न मिलान से मेल खाने के प्रकार को कैसे दूर किया जाए। मैं पैरामीटरयुक्त प्रकारों के इंडेक्ससेक को बदलने के लिए तकनीक को लागू करने की कोशिश कर रहा हूं, लेकिन मैचों में असफल रहा है। ऐसा क्यों है और मैं इसे कैसे ठीक कर सकता हुं?मैनिफेस्ट

object Example extends App{ 
    class TableColumn[T](
     val values: IndexedSeq[T], 
     val name: Option[String] = None 
    )(implicit val m: Manifest[T]) 

    class Def[C](implicit desired : Manifest[C]) { 
     def unapply[X](c : X)(implicit m : Manifest[X]) : Option[C] = { 
      //println("m.toString+", "+desired.toString) 
      def sameArgs = desired.typeArguments.zip(m.typeArguments).forall { 
       case (desired,actual) => desired >:> actual 
      } 
      if (desired >:> m && sameArgs) Some(c.asInstanceOf[C]) 
      else None 
     } 
    } 

    val IntTableColumn = new Def[TableColumn[Int]] 
    val DoubleTableColumn = new Def[TableColumn[Double]] 

    class Analysis(data: IndexedSeq[TableColumn[_]]){ 
     val transformedData = data.map{_ match{ 
      case IntTableColumn(tc) => println("Column of Int! "+ tc) 
      case DoubleTableColumn(tc) => println("Column of Double! "+ tc) 
      case _ => println("no match") 
     }} 
    } 

    new Analysis(IndexedSeq(
      new TableColumn(IndexedSeq(1,2,3)), 
      new TableColumn(IndexedSeq(1.0,2.0,3.0)) 
    )) 
} 

अगर मैं डेफ में लाइन uncomment तो मैं इस तरह के

prototype.Example$TableColumn[_ <: Any], prototype.Example$TableColumn[Int] 

सुझाव है कि _ विश्लेषण निर्माता में समस्या यह है के रूप में लाइनों देखते हैं, लेकिन मैं नहीं जानता कि और क्या में डालने के लिए क्या आप वहां मौजूद हैं।

+2

क्या आप लेख में इस वाक्यांश को पढ़ने: "यह प्रकट की typeArguments के उपयोग की सूचना के लिए महत्वपूर्ण है। यह प्रत्येक प्रकार के आकृति के प्रकट होने की सूची देता है। आप वांछित == मीटर की तुलना नहीं कर सकते क्योंकि मैनिफेस्ट तुलना गहरे नहीं हैं। इस कोड में एक कमजोरी है जिसमें यह केवल जेनरिक को संभाला जाता है जो 1 स्तर गहरा होता है। " आस-पास की चर्चा आपको यह ठीक से नहीं बताएगी कि इसे कैसे ठीक किया जाए, लेकिन यह आपको बताएगा कि यह क्यों काम नहीं करता है। –

+0

@Rex: मैं लेख के कुछ बेहतर बिंदुओं में खो गया हूं, लेकिन अब आप इसे इंगित करते हैं कि मैं समस्या देखता हूं और इस बारे में सोचना होगा कि मैं इसे किसी अन्य तरीके से संबोधित कर सकता हूं या नहीं। धन्यवाद – Pengin

+1

वास्तव में दो समस्याएं हैं: एक घोंसला है और दूसरा यह है कि आपके पास एक सूची में कई प्रकार हैं, जिसके लिए प्रकार चौड़ाई की आवश्यकता होती है। मुझे लगता है कि आप अंतिम समाधान में कुछ 'आश्वस्त करने योग्य' से चाहते हैं, लेकिन दुर्भाग्यवश मेरे पास अभी समाधान लिखने का समय नहीं है। –

उत्तर

1

रेक्स केर से टिप्पणियों के लिए धन्यवाद मैंने कुछ ऐसा काम किया है जो मुझे लगता है। यह शायद अधिक सुंदर ढंग से/आम तौर पर किया जा सकता है, लेकिन यह काम अब के लिए किया जाना लगता है:

object Example extends App{ 
    class TableColumn[T](
      val values: IndexedSeq[T], 
      val name: Option[String] = None 
    )(implicit val m: Manifest[T]) 

    class TableColumnMatcher[T](implicit desired: Manifest[T]){ 
     def unapply(tc: TableColumn[_]): Option[TableColumn[T]] = { 
      if(tc.m == desired) Some(tc.asInstanceOf[TableColumn[T]]) 
      else None 
     } 
    } 
    object TableColumnMatcher{ 
     lazy val IntTC = new TableColumnMatcher[Int] 
     lazy val DoubleTC = new TableColumnMatcher[Double] 
    } 


    class Analysis(data: IndexedSeq[TableColumn[_]]){ 
     import TableColumnMatcher._ 
     val transformedData = data.map{_ match{ 
      case IntTC(tc) => println("Column of Ints!"); 
      case DoubleTC(tc) => println("Column of Doubles!") 
      case _ => println("no match") 
     }} 
    } 

    new Analysis(IndexedSeq(
      new TableColumn(IndexedSeq(1,2,3)), 
      new TableColumn(IndexedSeq(1.0,2.0,3.0)) 
    )) 
}