2017-01-03 6 views
3

Ich bekam einen Fehler, als ich Code wie foo.map(case Foobar(x,y) => something) schrieb. Später habe ich entdeckt, dass ich Klammer Klammern verwenden muss, um die anonyme Funktion (case Foobar(x,y) => something) zu wickeln. Nachfolgend finden Sie eine Demo von der scala REPL:Warum ist Klammer Klammer in Arity-1 Methode Aufruf erforderlich?

scala> val a = List(((1, 2),3), ((4,5),6)) 
a: List[((Int, Int), Int)] = List(((1,2),3), ((4,5),6)) 

scala> a.map({case ((a,b),c) => (a,b,c)}) 
res0: List[(Int, Int, Int)] = List((1,2,3), (4,5,6)) 

scala> a.map(case ((a,b),c) => (a,b,c)) 
<console>:1: error: illegal start of simple expression 
a.map(case ((a,b),c) => (a,b,c)) 

Beachten Sie, dass die Klammer Klammern oben in dem letzten Befehl im Vergleich zu der entfernt werden.

Also, was ist der Grund für dieses Verhalten? Warum kann der Scala-Compiler die anonyme Funktion nicht ohne die geschweiften Klammern ableiten?

Antwort

5

Denn ohne die geschweiften Klammern Sie nur eine Instanz von FunctionN jedoch mit den geschweiften Klammern zu schaffen sind Sie eine Instanz von PartialFunction zu schaffen, die Ihnen case mit einer Destrukturierung Klausel verwenden.

Sie können die Dokumente überprüfen für PartialFunctionhere, die ein ziemlich einfaches Beispiel zeigt:

val f: PartialFunction[Int, Any] = { case _ => 1/0 } 

Beachten Sie, dass dieses Verhalten zur Zeit als unerwünscht angesehen wird und wird in Dotty fixiert werden. Mit Dotty Ihre Funktion würde dies werden:

a.map(((a,b),c) => (a,b,c)) 

Weitere Informationen auf, dass Sie überprüfen Schlitten 37 kann in this presentation.

+2

Das allein gleiten macht mich zu Dotty wechseln wollen ... –

+2

Ja, wird Dotty sein wirklich großartig. Bald! –

+2

Wenn ich schlau genug wäre, etwas beizutragen, würde ich definitiv ... –