Конвенція про іменування для констант Scala?


97

Яка умова іменування для констант Scala? Короткий пошук пропозицій StackOverflow у верхньому регістрі CamelCase (перший рядок нижче), але я хотів ще раз перевірити.

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

Який рекомендований стиль Scala?


2
Коли його слід використовувати як звичайну, повністю визначену константу в стилі C- / Java, першою. Друга форма - і підкреслення в іменах загалом - насправді ніколи не використовується. Третій зазвичай використовується для незмінних значень, які генеруються динамічно.
Дестін,

3
Я використовую другий, але переважно до попереднього досвіду Java. Ігноруючи це, я думаю, що більшість офіційних способів є першим (оскільки він використовується в самій програмі scala lib, наприклад, подивіться на π, який визначається як Pi).
ом-ном-ном

Відповіді:


127

Офіційно рекомендований стиль (і я маю на увазі офіційно) - це перший стиль, футляр на верблюдах з першою літерою - великі. Це чітко викладено Одерським щодо програмування в Scala.

Стилю також дотримується стандартна бібліотека, і він має певну підтримку в мовній семантиці: ідентифікатори, що починаються з великих регістрів, розглядаються як константи у збігу шаблонів.

(Розділ 6.10, с. 107 у другому виданні)


1
Дивлячись на офіційні вказівки щодо присвоєння імен Scala, варіант 3 насправді є рекомендованим стилем: docs.scala-lang.org/style/…
Маттіас

4
@Matthias Це не охоплює константи. Жахливий недогляд, але, повірте, не тільки це неправильно, але третій стиль спричинить проблеми , як тільки ви використаєте його на збігу шаблону.
Daniel C. Sobral

1
@Matthias Я зараз відкрив випуск про це. Я зазвичай роблю виправлення і пишу це, але мені, на жаль, бракує часу в наші дні. :(
Daniel C. Sobral

1
@samthebest Non-sense. Це має цілковитий сенс у рисах характеру, і навіть у обсязі функцій має сенс, якщо ви збираєтеся використовувати його для зіставлення зразків.
Daniel C. Sobral,

1
Я використовую scalastyle для перевірки на порушення стилю в моєму коді. Але це, схоже, не вловлює цих помилок в умовних іменах для констант. Чи є спосіб увімкнути перевірку, яка гарантує, що константи називаються у випадку верблюда з великою першою літерою?
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
якщо регістр Some (lowerConst) затінює val lowerConst, чому це не так, якщо case Some (UpperConst) затінює val UpperConst?
Адріан,

@Leif Wickland @Daniel C. Sobral Чи має значення константа значення для конвенції узгодження шаблонів? наприклад, val UpperConst = "UPPER_CONST"добре, або це повинно бутиval UpperConst = "UpperConst"
нір

7

Постійні імена мають бути у верхньому регістрі верблюда. Тобто, якщо член є остаточним, незмінним і він належить об’єкту пакета або об’єкту , це може вважатися константою .... Імена методів, значень та змінних мають бути в нижньому регістрі верблюда

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


Чи значення констант має значення для домовленості узгодження шаблонів? напр. val, UpperConst = "UPPER_CONST"як частина Java-стилю добре, або це повинно бутиval UpperConst = "UpperConst"
нір
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.