Konwencja nazewnictwa dla stałych Scala?

98

Jaka jest konwencja nazewnictwa dla stałych Scali? Krótkie wyszukiwanie w sugestiach StackOverflow z wielkimi literami CamelCase (pierwsza linia poniżej), ale chciałem dokładnie sprawdzić.

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

Jaki jest zalecany styl Scala?

grautur
źródło
2
Kiedy ma być używany jako konwencjonalna, całkowicie predefiniowana stała w stylu C / Java, pierwsza. Druga forma - i ogólnie w nazwach podkreśla się - nigdy tak naprawdę nie jest używana. Trzeci jest zwykle używany dla niezmiennych wartości, które są generowane dynamicznie.
Destin
3
Używam drugiego, ale głównie do wcześniejszych doświadczeń z Javą. Pomiń to, myślę, że najbardziej oficjalny sposób jest pierwszy (ponieważ jest używany w samej scala lib, np. Spójrz na π, które jest zdefiniowane jako Pi).
om-nom-nom

Odpowiedzi:

128

Oficjalnie zalecany styl (i mam na myśli oficjalnie) to pierwszy styl, wielbłądzie z pierwszą literą są duże. Jest to jasno określone przez Odersky'ego na temat programowania w Scali.

Po stylu następuje również biblioteka standardowa i ma pewne wsparcie w semantyce języka: identyfikatory zaczynające się od dużych liter są traktowane jako stałe w dopasowywaniu wzorców.

(Punkt 6.10, str. 107 w drugim wydaniu)

Daniel C. Sobral
źródło
1
Patrząc na oficjalne wytyczne dotyczące nazewnictwa Scali, wariant 3 jest w rzeczywistości zalecanym stylem: docs.scala-lang.org/style/…
Matthias,
4
@Matthias To nie obejmuje stałych. Straszne przeoczenie, ale uwierz mi, nie tylko to nie jest poprawne, ale trzeci styl będzie sprawiał problemy , gdy tylko użyjesz go na dopasowaniu wzoru.
Daniel C. Sobral
1
@Matthias Otworzyłem teraz numer na ten temat. Normalnie bym to naprawił i PR, ale ostatnio niestety brakuje mi czasu. :(
Daniel C. Sobral
1
@samthebest Non-sense. Ma to sens w cechach, a nawet w zakresie funkcji ma sens, jeśli zamierzasz go używać do dopasowywania wzorców.
Daniel C. Sobral,
1
Używam scalastyle do sprawdzania naruszeń stylu w moim kodzie. Ale wydaje się, że nie wyłapuje tych błędów konwencji nazewnictwa dla stałych. Czy istnieje sposób, aby włączyć kontrolę, która gwarantuje, że stałe są nazywane w przypadku wielbłąda z pierwszą literą wielką?
jithinpt
43

(To jest komentarz w dodatku do odpowiedzi Daniela, ale zamieszczam go jako odpowiedź na korzyść podświetlania i formatowania składni).

Uwaga Daniela dotycząca stylu używania dużej litery jako ważnej w semantyce języka jest bardziej subtelna i ważniejsza, niż początkowo przypisywałem jej, kiedy uczyłem się Scali.

Rozważ następujący kod:

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!")
      }
    }
  }
}

Naiwnie spodziewałbym się, że dotrze to do wszystkich przypadków w meczu. Zamiast tego drukuje:

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

Chodzi o to, że przesłaniają wartość case Some(lowerConst)val lowerConsti tworzą lokalną zmienną o tej samej nazwie, która zostanie zapełniona za każdym razem, gdy Someoceniany jest łańcuch zawierający ciąg.

Wprawdzie istnieją sposoby na obejście tego problemu, ale najprościej jest postępować zgodnie z przewodnikiem po stylu dotyczącym ciągłego nazywania.

Jeśli nie możesz przestrzegać konwencji nazewnictwa, to jak @reggoodwin wskazuje w komentarzach poniżej, możesz umieścić nazwę zmiennej w znacznikach

case Some(`lowerConst`) => println("lower!")
Leif Wickland
źródło
1
Dodając do odpowiedzi Leifa: ten scenariusz jest wspomniany w Programming in Scala 15.2. Jeśli nie ma innego wyjścia, jak tylko użyć stałej zaczynającej się od małej litery, można ją uciec za pomocą tylnych znaczników, np. Case `pi` => ....
reggoodwin
1
jeśli przypadek Some (lowerConst) przesłania val lowerConst, dlaczego przypadek Some (UpperConst) nie zasłoni wartości val UpperConst?
Adrian,
@Leif Wickland @Daniel C. Sobral Czy wartość stałych ma znaczenie ze względu na konwencję dopasowania wzorców? np. val UpperConst = "UPPER_CONST"dobrze albo powinno byćval UpperConst = "UpperConst"
nir
7

Stałe nazwy powinny być pisane wielkimi literami. Oznacza to, że jeśli element członkowski jest ostateczny, niezmienny i należy do obiektu pakietu lub obiektu , może zostać uznany za stałą .... Nazwy metod, wartości i zmiennych powinny być pisane małymi wielbłądami

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

samthebest
źródło
Czy wartość stałych ma znaczenie ze względu na konwencję dopasowania wzorców? np. val UpperConst = "UPPER_CONST"jak część w stylu java w porządku lub powinno byćval UpperConst = "UpperConst"
nir