370 Stimmen

Was ist der formale Unterschied in Scala zwischen geschweiften und geklammerten Klammern, und wann sollten sie verwendet werden?

Was ist der formale Unterschied zwischen der Übergabe von Argumenten an Funktionen in Klammern () und in Klammern {} ?

Das Gefühl, das ich bei der Programmierung in Scala Buch ist, dass Scala ziemlich flexibel ist und ich diejenige verwenden sollte, die mir am besten gefällt, aber ich stelle fest, dass einige Fälle kompiliert werden und andere nicht.

Zum Beispiel (nur als Beispiel gemeint; ich wäre dankbar für jede Antwort, die den allgemeinen Fall erörtert, nicht nur dieses spezielle Beispiel):

val tupleList = List[(String, String)]()
val filtered = tupleList.takeWhile( case (s1, s2) => s1 == s2 )

\=> Fehler: Unzulässiger Beginn eines einfachen Ausdrucks

val filtered = tupleList.takeWhile{ case (s1, s2) => s1 == s2 }

\=> gut.

8voto

fjdumont Punkte 1507

Denn Sie verwenden case definieren Sie eine Teilfunktion, und Teilfunktionen erfordern geschweifte Klammern.

5voto

samthebest Punkte 29529

Verbesserte Kompilierprüfung mit Parens

Die Autoren von Spray empfehlen, dass runde Parens eine bessere Kompilierprüfung ermöglichen. Dies ist besonders wichtig für DSLs wie Spray. Durch die Verwendung von Parens teilen Sie dem Compiler mit, dass er nur eine einzige Zeile erhalten soll; wenn Sie ihm also versehentlich zwei oder mehr geben, wird er sich beschweren. Dies ist bei geschweiften Klammern nicht der Fall. Wenn Sie zum Beispiel irgendwo einen Operator vergessen, wird Ihr Code kompiliert, Sie erhalten unerwartete Ergebnisse und möglicherweise einen schwer zu findenden Fehler. Das folgende Beispiel ist konstruiert (da die Ausdrücke rein sind und zumindest eine Warnung ausgeben), macht aber den Punkt deutlich

method {
  1 +
  2
  3
}

method(
  1 +
  2
  3
 )

Die erste kompiliert, die zweite ergibt error: ')' expected but integer literal found. der Autor wollte schreiben 1 + 2 + 3 .

Man könnte argumentieren, dass es bei Methoden mit mehreren Parametern und Standardargumenten ähnlich ist; es ist unmöglich, bei der Verwendung von Parens versehentlich ein Komma zur Trennung der Parameter zu vergessen.

Wortbedeutung

Ein wichtiger, oft übersehener Hinweis zur Ausführlichkeit. Die Verwendung geschweifter Klammern führt unweigerlich zu ausführlichem Code, da der Scala-Style-Guide eindeutig besagt, dass schließende geschweifte Klammern in einer eigenen Zeile stehen müssen: http://docs.scala-lang.org/style/declarations.html "... die schließende Klammer steht in einer eigenen Zeile unmittelbar nach der letzten Zeile der Funktion." Viele automatische Formatierer, wie z.B. Intellij, führen diese Umformatierung automatisch für Sie durch. Versuchen Sie also, runde Klammern zu verwenden, wenn Sie können. Z.B.. List(1, 2, 3).reduceLeft{_ + _} wird:

List(1, 2, 3).reduceLeft {
  _ + _
}

-1voto

Klammern werden in einem idealen Kodierungsstil grundsätzlich für einzeiligen Code verwendet. Wenn der betreffende Code jedoch mehrzeilig ist, ist die Verwendung von geschweiften Klammern der bessere Weg.

-3voto

keitine Punkte 21

Bei geschweiften Klammern wird das Semikolon für Sie eingeführt, Klammern nicht. Betrachten Sie takeWhile Funktion, da sie eine Teilfunktion erwartet, nur {case xxx => ??? } ist eine gültige Definition anstelle von Klammern um den Ausdruck case.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X