Namenskonvention für Scala-Konstanten?

97

Was ist die Namenskonvention für Scala-Konstanten? Eine kurze Suche nach StackOverflow-Vorschlägen in Großbuchstaben CamelCase (die erste Zeile unten), aber ich wollte es noch einmal überprüfen.

val ThisIsAConstant = 1.23
val THIS_IS_ANOTHER_CONSTANT = 1.55
val thisIsAThirdConstant = 1.94

Welcher Scala-Stil wird empfohlen?

grautur
quelle
2
Wenn es wie eine herkömmliche, vollständig vordefinierte Konstante im C- / Java-Stil verwendet werden soll, die erste. Die zweite Form - und Unterstreichungen in Namen im Allgemeinen - wird nie wirklich verwendet. Der dritte wird im Allgemeinen für unveränderliche Werte verwendet, die dynamisch generiert werden.
Destin
3
Ich benutze die zweite, aber hauptsächlich aufgrund vorheriger Java-Erfahrungen. Ignorieren Sie das, ich denke, der offiziellste Weg ist der erste (da er in der Scala Lib selbst verwendet wird, z. B. π, definiert als Pi).
Om-Nom-Nom

Antworten:

127

Der offiziell empfohlene Stil (und ich meine offiziell) ist der erste Stil, Kamelkoffer mit Anfangsbuchstaben sind Großbuchstaben. Es wird von Odersky über die Programmierung in Scala klar festgelegt.

Dem Stil folgt auch die Standardbibliothek und wird in der Sprachsemantik unterstützt: Bezeichner, die mit Großbuchstaben beginnen, werden beim Mustervergleich als Konstanten behandelt.

(Abschnitt 6.10, S. 107 in der zweiten Ausgabe)

Daniel C. Sobral
quelle
1
In Anbetracht der offiziellen Scala- Namensrichtlinien
Matthias
4
@Matthias Das deckt keine Konstanten ab. Ein schreckliches Versehen, aber glauben Sie mir, nicht nur das ist nicht richtig, sondern der dritte Stil wird Probleme verursachen , sobald Sie ihn für eine Musterübereinstimmung verwenden.
Daniel C. Sobral
1
@Matthias Ich habe jetzt eine Ausgabe darüber geöffnet . Normalerweise würde ich das Problem beheben und PR machen, aber mir fehlt heutzutage leider die Zeit. :(
Daniel C. Sobral
1
@samthebest Unsinn. In Merkmalen ist dies absolut sinnvoll, und selbst im Funktionsumfang ist es sinnvoll, wenn Sie es für den Mustervergleich verwenden.
Daniel C. Sobral
1
Ich habe Scalastyle verwendet, um in meinem Code nach Stilverletzungen zu suchen. Diese Fehler bei der Namenskonvention für Konstanten scheinen jedoch nicht abzufangen. Gibt es eine Möglichkeit, eine Prüfung zu aktivieren, die sicherstellt, dass Konstanten im Kamelfall mit dem Großbuchstaben groß geschrieben werden?
Jithinpt
43

(Dies ist ein Nachtragskommentar zu Daniels Antwort, aber ich poste ihn als Antwort, um die Syntax hervorzuheben und zu formatieren.)

Daniels Argument, dass der Stil der Verwendung eines Anfangsbuchstaben in der Sprachsemantik wichtig ist, ist subtiler und wichtiger, als ich es ursprünglich beim Erlernen von Scala anerkannt hatte.

Betrachten Sie den folgenden Code:

object Case {
  val lowerConst = "lower"
  val UpperConst = "UPPER"

  def main(args: Array[String]) {
    for (i <- Seq(lowerConst, UpperConst, "should mismatch.").map(Option.apply)) {
      print("Input '%s' results in: ".format(i))
      i match {
        case Some(UpperConst) => println("UPPER!!!")
        case Some(lowerConst) => println("lower!")
        case _ => println("mismatch!")
      }
    }
  }
}

Naiv hätte ich erwartet, dass das alle Fälle im Match erreichen würde. Stattdessen wird gedruckt:

Input 'Some(lower)' results in: lower!
Input 'Some(UPPER)' results in: UPPER!!!
Input 'Some(should mismatch.)' results in: lower!

Was passiert ist, dass die case Some(lowerConst)Schatten den Wert lowerConstund eine lokale Variable mit dem gleichen Namen erstellt, die jedes Mal Someausgefüllt wird, wenn eine, die eine Zeichenfolge enthält, ausgewertet wird.

Es gibt zwar Möglichkeiten, dies zu umgehen, aber die einfachste besteht darin, den Styleguide für die ständige Benennung zu befolgen.

Wenn Sie der Namenskonvention nicht folgen können, können Sie, wie @reggoodwin in den Kommentaren unten ausführt, den Variablennamen wie folgt in Häkchen setzen

case Some(`lowerConst`) => println("lower!")
Leif Wickland
quelle
1
Hinzufügen zu Leifs Antwort: Dieses Szenario wird in Programmieren in Scala 15.2 erwähnt. Wenn es keine andere Wahl gibt, als eine Konstante zu verwenden, die mit einem Kleinbuchstaben beginnt, kann sie mit Back Ticks maskiert werden, z. B. case `pi` => ....
reggoodwin
1
Wenn case Some (lowerConst) das val lowerConst beschattet, warum beschattet case Some (UpperConst) nicht das val UpperConst?
Adrian
@Leif Wickland @Daniel C. Sobral Ist der Wert von Konstanten aus Gründen der Konvention des Mustervergleichs von Bedeutung? zB val UpperConst = "UPPER_CONST"okay oder es sollte seinval UpperConst = "UpperConst"
nir
7

Konstante Namen sollten in Großbuchstaben angegeben werden. Das heißt, wenn das Mitglied endgültig und unveränderlich ist und zu einem Paketobjekt oder einem Objekt gehört , kann es als Konstante betrachtet werden. Methoden-, Wert- und Variablennamen sollten in Kleinbuchstaben angegeben werden

http://docs.scala-lang.org/style/naming-conventions.html#constants-values-variable-and-methods

samthebest
quelle
Ist der Wert von Konstanten aus Gründen der Konvention des Mustervergleichs von Bedeutung? zB val UpperConst = "UPPER_CONST"wie Teil Java-Stil okay oder es sollte seinval UpperConst = "UpperConst"
nir