2014-11-09 2 views
8

Ich habe eine Frage bezüglich dieses Muster in scala passend:Pattern Matching Funktionsargumente

val div: (Double, Double) => Double = { 
    case (x, y) if y != 0 => x/y 
} 

Ich habe zu verstehen, wie Muster funktioniert und seine syntaxis in scala passend, aber dieser Ausdruck macht mich verrückt. Wie weiß Compiler, dass x und y Argumente der Funktion und des Musters auf ihnen sind?

Antwort

9

Die Regeln dafür sind in Abschnitt 8.5 "Pattern Matching Anonymous Functions" der Scala Language Specification definiert. Wenn Sie eine anonyme Funktion mit Mustererkennung verwenden, muss der Typ teilweise bereitgestellt werden. Sie tun das, indem Sie sagen, der Typ ist (Double, Double) => Double, die Abkürzung für Function2[Double, Double, Double] ist.

Jetzt:

Wenn der erwartete Typ ist scala.Function k [S1,…,Sk, R], wird der Ausdruck entspricht die anonyme Funktion zu messen:

 
(x1:S1,…,xk:Sk) => (x1,…,xk) match { 
    case p1 => b1 … case pn => bn 
} 

egal Also, was die arity Ihrer Funktion, Die Musterübereinstimmung wird an ein Tupel der Argumente der Funktion übergeben. Daher können Sie die Syntax für reguläre Tupel-Extraktoren verwenden.

So Ihr Beispiel ist die Abkürzung für

val div: (Double, Double) => Double = (a, b) => (a, b) match { 
    case (x, y) if y != 0 => x/y 
} 

oder

val div = (a: Double, b: Double) => (a, b) match { 
    case (x, y) if y != 0 => x/y 
} 

Die der Extraktor-Parameter Benennung x und y bis zu Ihrer Phantasie. Sie entscheiden, wie Sie die resultierenden Elemente des Extraktors aufrufen, Sie könnten auch case (foo, bar) => ...

schreiben