Почему Scala выбирает типы после имен переменных? - PullRequest
36 голосов
/ 22 мая 2011

В Scala переменные объявляются как:

var stockPrice: Double = 100.

Где тип (Double) следует за идентификатором (stockPrice). Традиционно в императивных языках, таких как C, Java, C #, имя типа предшествует идентификатору.

double stock_price = 100.0;

Это чисто вопрос вкуса или, в конце концов, наличие имени типа в конце помогает компилятору? Go также имеет тот же стиль.

Ответы [ 4 ]

63 голосов
/ 22 мая 2011

Кевин понял все правильно.Основное наблюдение заключается в том, что синтаксис «имя типа» прекрасно работает, если типы являются короткими ключевыми словами, такими как int или float :

int x = 1
float d = 0.0

По ценеодного из них вы получаете две части информации: «здесь начинается новое определение» и «вот (определение) тип определения».Но в настоящее время мы далеко минуем область простых примитивных типов.Если вы пишете

HashMap<Shape, Pair<String, String>> shapeInfo = makeInfo()

, самая важная часть того, что вы определяете (имя), скрывается за выражением типа.Сравните с

val shapeInfo: HashMap[Shape, (String, String)] = makeInfo()

Это ясно говорит

  • Здесь мы определяем значение, а не переменную или метод (val)
  • Название определяемой нами вещиэто shapeInfo
  • Если вы заботитесь об этом, вот тип (HashMap [...])
51 голосов
/ 22 мая 2011

Помимо поддержки вывода типов, это также имеет эргономическое преимущество.

Для любого заданного имени переменной + типа есть вероятность, что имя является более важной частью информации. Перемещение влево делает его более заметным, а код - более читабельным, когда вы привыкнете к стилю.

Другие эргономические преимущества:

  • С val, var или def перед именами элементов, вместо их типа, все они аккуратно выстраиваются в столбец.
  • Если вы измените только тип элемента или полностью отбросите его в пользу логического вывода, то мелкозернистый инструмент сравнения четко покажет, что имя не изменилось
  • Аналогично, переключение между val / var / def очень ясно в diffs
  • Вывод должен рассматриваться как поведение по умолчанию в Scala, вам нужны только спецификации типов в определенных конкретных сценариях, даже тогда это в основном делается для компилятора. Поэтому размещение их в самом начале декларации подчеркивает неправильную вещь.
  • «имя: тип» вместо «имя типа» более точно соответствует тому, как большинство программистов на самом деле думают об объявлении, это более естественно.
  • Различные соглашения C / C ++ и Java для указателей и массивов (т. Е. * является префиксом для следующего имени, а не суффиксом для предыдущего типа в C / C ++, или [] является допустимым суффиксом для обоих имена и типы в Java) все еще вводят в заблуждение новичков или преобразователей языка и вызывают некоторые очень реальные ошибки при объявлении нескольких переменных в одной строке. Скала не оставляет здесь места для сомнений и замешательства.
15 голосов
/ 22 мая 2011

После этого его можно удалить для вывода типа:

var stockPrice: Double = 100.0
var stockPrice = 100.0

Однако, не верно, что императивные языки традиционно сначала имеют типы. Например, Паскаль не делает.

Теперь C делает это, а C ++, Java и C # основаны на синтаксисе C, поэтому, естественно, они тоже так делают, но это не имеет ничего общего с императивными языками.

5 голосов
/ 22 мая 2011

Следует отметить, что даже C "традиционно" не определяет тип перед именем переменной, но действительно допускает чередование объявлений.

int foo[];

, где тип для foo объявлен какдо и после него, лексически.

Кроме того, я предполагаю, что это различие без разницы.Разработчики компилятора, конечно, не могли заботиться так или иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...