2016-06-07 3 views
1

Dies kompiliert:Warum kann Scala keine Funktionsketten mit einer Mischung aus Leerzeichen und Punkten zusammenstellen?

paragraphs.map { a => 

}.filter { b => 

}.map { c => 

}.sortBy { d => 

}.reverse 

So dies tut:

paragraphs map { a => 

} filter { b => 

} map { c => 

} sortBy { d => 

} reverse // <- warning about postfix notation 

Aber dies nicht (kann nicht Variablen innerhalb sortBy lösen):

paragraphs map { a => 

} filter { b => 

} map { c => 

} sortBy { d => 

}.reverse 

Ist es Operator Vorrang? Wenn ja, aus welchen Gründen bevorzugen Sie eine Version gegenüber der anderen?

+0

Bitte post [Mindestarbeitsbeispiele] (https://en.wikipedia.org/wiki/Minimal_Working_Example) in deinen Fragen. – dhg

Antwort

5

Der Punkt hat Vorrang, so was wird es immer ist eine Art:

(1 to 5) map { a => a } filter ({ b => true }.reverse) 
<console>:11: error: missing parameter type 
      (1 to 5) map { a => a } filter ({ b => true }.reverse) 
              ^

Und {b => true} kein Verfahren reverse haben. Technisch ist {b => true} nicht einmal ein gültiger Ausdruck, aber man kann es eine gültiges PartialFunction machen, indem die erwartete Art von b Angabe, so dass Ihnen eine nützliche Fehlermeldung geben:

(1 to 5) map { a => a } filter { b: Int => true }.reverse 
<console>:11: error: value reverse is not a member of Int => Boolean 
      (1 to 5) map { a => a } filter { b: Int => true }.reverse 
                  ^

Beachten Sie jedoch, dass Postfix-Operatoren (dh ohne Punkte) sind nun dis-empfohlen, und Sie erhalten eine Warnung, wenn Sie versuchen, sie zu benutzen:

~$ scala -feature 
Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_79). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> (1 to 5) map { a => a } filter { b => true } reverse 
<console>:11: warning: postfix operator reverse should be enabled 
by making the implicit value scala.language.postfixOps visible. 
This can be achieved by adding the import clause 'import scala.language.postfixOps' 
or by setting the compiler option -language:postfixOps. 
See the Scala docs for value scala.language.postfixOps for a discussion 
why the feature should be explicitly enabled. 
     (1 to 5) map { a => a } filter { b => true } reverse 
+0

Geringfügige Klarstellung: "Postfix-Operatoren (dh ohne Punkte)" sollten "ohne Punkte und Argumente" sein. Der Compiler will etwas "reverse", aber das '(1 bis 5) map {a => a} Filter {b => true}' ist in Ordnung. –

Verwandte Themen