Wann wird das Gleichheitszeichen in einer Scala-Methodendeklaration verwendet?


85

Mit Gleichheitszeichen:

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
  }
}

Ohne Gleichheitszeichen:

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello!")
  }
}

Beide oben genannten Programme werden auf die gleiche Weise ausgeführt. In dem Blog-Beitrag Dinge, die ich in Scala nicht mag, habe ich gelesen, dass die Methode zurückgegeben wird, wenn das Gleichheitszeichen fehlt Unit(wie bei Java void). Daher müssen Methoden, die einen Wert zurückgeben, das Gleichheitszeichen verwenden. Methoden, die keinen Wert zurückgeben, können jedoch so oder so geschrieben werden.

Was ist die beste Vorgehensweise für die Verwendung des Gleichheitszeichens in Scala-Methoden, die keinen Wert zurückgeben?

Antworten:


108

Ich stimme Daniel eigentlich nicht ganz zu. Ich denke, die ungleiche Syntax sollte niemals verwendet werden. Wenn Ihre Methode als API verfügbar gemacht wird und Sie befürchten, versehentlich den falschen Typ zurückzugeben, fügen Sie eine explizite Typanmerkung hinzu:

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello!")
    123
  }
}

Die ungleiche Syntax ist kürzer und sieht möglicherweise "sauberer" aus, aber ich denke, sie fügt nur die Möglichkeit von Verwirrung hinzu. Ich habe manchmal vergessen, ein Gleichheitszeichen hinzuzufügen, und glaubte, dass meine Methode einen Wert zurückgab, als sie tatsächlich Unit zurückgab. Da die Syntaxen für ungleiche und abgeleitete Typen visuell so ähnlich sind, ist dieses Problem leicht zu übersehen.

Obwohl es mich etwas mehr Arbeit kostet, bevorzuge ich die expliziten Typanmerkungen, wenn sie wichtig sind (nämlich exponierte Schnittstellen).


1
Ich mag diesen Ansatz, er ist expliziter und somit für den Leser klarer.
Lukasz Korzybski

4
Anscheinend ist das jetzt der empfohlene Stil ( docs.scala-lang.org/style/declarations.html#procedure_syntax ), also ändere ich dies, um die akzeptierte Antwort zu sein.
Esko Luontola

1
Ich stimme auch dem zu, ich denke, die Syntax ohne das = sollte vollständig aus der Sprache entfernt werden
Ahmed Soliman Farghal

7
Martin Odersky sagte in seiner Keynote "Scala with Style", dass es ein historischer Fehler sei. Er musste diese Syntax hinzufügen (ohne =), damit er "Unit" vor Java-Entwicklern verstecken kann, damit sie nicht verwirrt werden. Er erwähnte auch, dass es in Zukunft entfernt wird.
Radian

2
Gibt es eine Möglichkeit zu WARNEN, wenn das Gleichheitszeichen in der Methodendefinition vergessen wurde? Zum Beispiel als Compiler-Option oder in einem Quellanalyse-Tool?
VasiliNovikov

42

UPDATE: Ab Scala-2.10 wird die Verwendung des Gleichheitszeichens bevorzugt. Alte Antwort:

Methoden, die zurückgeben, Unitsollten immer die ungleiche Syntax verwenden. Dies vermeidet mögliche Fehler bei der Implementierung, die in die API übertragen werden. Zum Beispiel hätten Sie versehentlich so etwas tun können:

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
    123
  }
}

Ein triviales Beispiel natürlich, aber Sie können sehen, wie dies ein Problem sein könnte. Da der letzte Ausdruck nicht zurückgegeben wird Unit, hat die Methode selbst einen anderen Rückgabetyp als Unit. Dies wird in der öffentlichen API angezeigt und kann später zu anderen Problemen führen. Bei der ungleichen Syntax spielt es keine Rolle, was der letzte Ausdruck ist. Scala korrigiert den Rückgabetyp als Unit.

Es ist auch zwei Zeichen sauberer. :-) Ich neige auch dazu zu denken, dass die ungleiche Syntax den Code nur ein wenig leichter lesbar macht. Es ist offensichtlicher, dass die fragliche Methode Uniteher einen nützlichen Wert zurückgibt als einen nützlichen.

In einem verwandten Zusammenhang gibt es eine analoge Syntax für abstrakte Methoden:

trait Foo {
  def bar(s: String)
}

Die Methode barhat eine Signatur String=>Unit. Scala tut dies, wenn Sie die Typanmerkung für ein abstraktes Element weglassen. Dies ist wieder einmal sauberer und (glaube ich) leichter zu lesen.


3
Das Gleichheitszeichen nicht zu verwenden, ist auch die Empfehlung im Scala Style Guide: davetron5000.github.com/scala-style/types/inference/…
Esko Luontola

6
Ich habe dieses Bit geschrieben, daher sollten Sie dies wahrscheinlich berücksichtigen, wenn Sie die Referenz abwägen. :-)
Daniel Spiewak

LoL, also habe ich diesen kleinen Austausch meiner Freundin beschrieben, außer aufgrund meiner schlechten Aussprache kam "bit" als "bitch" heraus. Unnötig zu erwähnen, dass eine Komödie folgte.
Saem

10
ScalaDays 2013, Martin Odersky, Keynote - Scala mit Stil Kapitel 45 : Prozedurdeklaration (ungleiche Syntax) sollte vermieden werden.
Senia

4
Der offizielle Styleguide
sbilstein

12

Sie müssen Gleichheitszeichen in Anrufdeklarationen verwenden, mit Ausnahme der Definitionen, die Unit zurückgeben.

In diesem letzteren Fall, Sie können das Gleichheitszeichen verzichten. Diese Syntax ist jedoch möglicherweise veraltet, sodass sie am besten vermieden wird. Die Verwendung des Gleichheitszeichens und die Deklaration des Rückgabetyps funktioniert immer.


Bücher, Mailingliste, Quellcode. Übrigens wurde seitdem klar, dass die letztere Syntax wahrscheinlich nicht veraltet ist und von vielen bevorzugt wird.
Daniel C. Sobral

1
docs.scala-lang.org/style/types.html#function_values Sieht so aus, als würde der Typ- Styleguide ohnehin immer = angeben.
BeepDog

4

Für Methoden empfiehlt Scala Style Guide die gleiche Syntax im Gegensatz zur Prozedursyntax

Prozedursyntax

Vermeiden Sie die Prozedursyntax, da sie bei sehr geringem Kürzegewinn eher verwirrend ist.

// don't do this
def printBar(bar: Baz) {
  println(bar)
}
// write this instead
def printBar(bar: Bar): Unit = {
  println(bar)
}

0

Eine Sache: Stellen Sie sich vor, die letzte Anweisung einer Methode, die Unit zurückgeben soll, gibt Unit nicht zurück. Die Verwendung der ungleichen Syntax ist dann sehr praktisch. Ich hoffe, dass dies nicht veraltet ist, da ich mehrere Anwendungsfälle dafür sehe


0

Im Laufe der Zeit hat sich der Standardstil geändert, und dies wurde in vielen Kommentaren zu Antworten erwähnt. Im offiziellen Styleguide wird empfohlen , die =Syntax für Funktionsdeklarationen zu verwenden.


1
Der von Ihnen bereitgestellte Link bezieht sich nur auf Funktionen, nicht auf Prozeduren (dh Funktionen, die Unit zurückgeben).
Esko Luontola

Sie haben Recht, @EskoLuontola. Tut mir leid, ich habe wahrscheinlich den falschen Link aus einer der vielen Registerkarten kopiert, die ich geöffnet hatte. Er wurde aktualisiert.
BeepDog

0

Bei Methoden, die keinen Rückgabewert haben, können Sie solche Methoden ausdrücken, indem Sie den Ergebnistyp und das Gleichheitszeichen weglassen. Folgen Sie dabei der Methode mit einem Block in geschweiften Klammern. In dieser Form sieht die Methode wie eine Prozedur aus, eine Methode, die nur wegen ihrer Nebenwirkungen ausgeführt wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.