2012-10-08 4 views
27

Was bedeutet [A : Manifest : WireFormat] im folgenden Code? Es ist von com.nicta.scoobi.TextInput (verfügbar auf GitHub). Es scheint keine der üblichen Typgrenzen zu sein.Bedeutung des zusätzlichen Doppelpunkts in der Scala-Klassenparametrisierung

def fromDelimitedTextFile[A : Manifest : WireFormat] 
     (path: String, sep: String = "\t") 
     (extractFn: PartialFunction[List[String], A]) 
    : DList[A] = { 

    val lines = fromTextFile(path) 
    lines.flatMap { line => 
     val fields = line.split(sep).toList 
     if (extractFn.isDefinedAt(fields)) List(extractFn(fields)) else Nil 
    } 
    } 

Wo finde ich weitere Informationen zu diesem Thema?

Antwort

35

Dies wird als Kontext gebunden bezeichnet. Sie sind syntaktischer Zucker für eine implizite Parameterliste:

def meth[A : ContextBound1 : ContextBoundN](a: A) 

// ==> 

def meth[A](a: A)(implicit evidence: ContextBound1[A], ContextBoundN[A]) 

Wenn es mehr Kontext von 1 bis N begrenzt, sie sind alle in die gleiche Parameterliste übersetzt. Eine ausführlichere Erklärung dazu, wie sie funktionieren und für was sie nützlich sind, finden Sie unter this question.

Um solche Symbole zu finden, ist es nützlich, die StackOverflow Scala Tutorial zu lesen.