Почему я должен указывать тип для переменных const, а не для переменных let? - PullRequest
10 голосов
/ 05 апреля 2019

Чтобы создать переменную в Rust, вы должны использовать:

let var_name = 10;

Это также будет действительным:

let var_name: i32 = 10;

Постоянные переменные создаются следующим образом:

const VAR_NAME: i32 = 10;

Но если вы попытались создать постоянную переменную, подобную этой:

const VAR_NAME = 10;

Вы получите сообщение об ошибке, похожее на это:

error: expected `:`, found `=`
 --> src/main.rs:5:11
  |
4 |   const VAR_NAME = 10;
  |                 ^ expected `:`

Из-за таких языков, как JavaScript, Python и PHP, меня это немного смущает.

Почему я должен указывать определение типа при использовании const, а не при использовании let?

1 Ответ

14 голосов
/ 05 апреля 2019

В настоящее время существует правило «Константы должны быть явно введены». (для static: «Статический элемент похож на константу»).

Но вы правы: компилятор может это сделать. Существует открытое обсуждение этого вопроса: # 1349 , TL; DR:

  • Мы можем технически вывести тип const и static переменная
  • Мы не используем их очень часто, поэтому не очень раздражает комментировать типы
  • Возможно, нам следует ограничить вывод типа для констант / статик только литеральным значением
  • Это может сделать сообщения об ошибках менее точными
  • Может быть, ограничение вывода типа для констант / статики локальными областями, такими как тела функций
  • Для целых чисел const FOO = 22 будет означать i32, поэтому, вероятно, не тот тип, который можно было бы ожидать. Итак, мы бы написали const FOO = 22usize.
  • Когда переменная инициализируется const-fn, тип должен быть выведен
  • Когда переменная инициализируется другой переменной, введенной явно
  • Для массивов явный тип очень избыточен
  • Для переменных, которые только экспортируются, мы можем оказаться не в состоянии вывести их типы (так что это будет ошибка времени компиляции "тип должен быть указан")

Возможно, стоит упомянуть, что одним из руководящих принципов вывода типов в Rust является то, что вывод типов должен быть локальным. По этой причине, в отличие от Haskell, сигнатуры функций всегда должны указываться полностью. Для этого есть несколько причин, в частности, это означает, что для читателей проще рассуждать и лучше сообщения об ошибках. Это ставит модуль уровня const в трудное положение, с точки зрения вывода. Матье М.

Пока еще не предложен RFC, поэтому этот вопрос остается открытым.

Смотри также:

...