Соглашение об именах для констант Scala?

97

Каково соглашение об именах констант Scala? Краткий поиск по StackOverflow предлагает верхний регистр CamelCase (первая строка ниже), но я хотел дважды проверить.

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

Какой стиль Scala рекомендуется использовать?

Grautur
источник
2
Когда он будет использоваться как обычная, полностью предопределенная константа в стиле C- / Java, первая. Вторая форма - и подчеркивания в именах в целом - на самом деле никогда не используется. Третий обычно используется для неизменяемых значений, которые генерируются динамически.
Дестин
3
Я использую второй, но в основном для предыдущего опыта работы с Java. Не обращайте внимания на это, я думаю, что наиболее официальный способ - это первый (поскольку он используется в самой scala lib, например, посмотрите на π, который определяется как Pi).
om-nom-nom

Ответы:

127

Официально рекомендуемый стиль (и я имею в виду официально) - это первый стиль, верблюжий регистр с первой буквой - это верхний регистр. Это ясно изложено Одерским при программировании на Scala.

Этому стилю также следует стандартная библиотека, и он имеет некоторую поддержку в семантике языка: идентификаторы, начинающиеся с верхнего регистра, обрабатываются как константы при сопоставлении с образцом.

(Раздел 6.10, с. 107 второго издания)

Дэниел С. Собрал
источник
1
Глядя на официальные правила присвоения имен Scala, можно сказать
Маттиас,
4
@Matthias Это не касается констант. Ужасная оплошность, но, поверьте мне, не только это неверно, но и третий стиль вызовет проблемы , как только вы воспользуетесь им для сопоставления с образцом.
Дэниел С. Собрал,
1
@Matthias Я открыл вопрос по этому поводу. Обычно я исправляю ситуацию и пиарю, но сейчас мне, к сожалению, не хватает времени. :(
Дэниел С. Собрал
1
@samthebest Глупость. Это имеет смысл в свойствах, и даже в контексте функций имеет смысл, если вы собираетесь использовать его для сопоставления с образцом.
Дэниел С. Собрал,
1
Я использую масштабирование для проверки нарушений стиля в моем коде. Но похоже, что он не улавливает эти ошибки соглашения об именах для констант. Есть ли способ включить проверку, которая гарантирует, что константы будут названы в верблюжьем регистре с заглавной первой буквой?
jithinpt
43

(Это дополнительный комментарий к ответу Даниэля, но я публикую его как ответ в целях выделения и форматирования синтаксиса.)

Точка зрения Дэниела о важности стиля использования начальной заглавной буквы в семантике языка более тонкая и важная, чем я изначально считал, когда изучал Scala.

Рассмотрим следующий код:

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

Я наивно ожидал, что это коснется всех случаев в матче. Вместо этого он печатает:

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

Что происходит, так это то, что case Some(lowerConst)тень затеняет val lowerConstи создает локальную переменную с тем же именем, которая будет заполнена каждый раз, когда Someвычисляется содержащая строка.

По общему признанию, есть способы обойти это, но самый простой - следовать руководству по стилю для постоянного именования.

Если вы не можете следовать соглашению об именах, то, как указывает @reggoodwin в комментариях ниже, вы можете поместить имя переменной в галочки, например

case Some(`lowerConst`) => println("lower!")
Лейф Викленд
источник
1
Добавление к ответу Лейфа: этот сценарий упоминается в Программе в Scala 15.2. Если нет другого выбора, кроме как использовать константу, начинающуюся с нижнего регистра, то ее можно экранировать обратными галочками, например case `pi` => ....
reggoodwin
1
если case Some (lowerConst) затеняет val lowerConst, почему case Some (UpperConst) не затеняет val UpperConst?
Адриан
@Leif Wickland @Daniel C. Sobral Имеет ли значение значение констант ради соглашения о сопоставлении с образцом? например, val UpperConst = "UPPER_CONST"хорошо или должно бытьval UpperConst = "UpperConst"
nir
7

Постоянные имена должны быть в верхнем регистре. То есть, если член final, неизменяемый и принадлежит объекту пакета или объекту , он может считаться константой .... Имена методов, значений и переменных должны быть в нижнем регистре верблюда.

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

Самтебест
источник
Имеет ли значение значение констант ради соглашения о сопоставлении с образцом? например val UpperConst = "UPPER_CONST"как часть java-style хорошо или должно бытьval UpperConst = "UpperConst"
nir