Подтвердить что ты не робот

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

В типах подсказок в Rust можно использовать частичные типы в комментариях, подобных этому:

let myvec: Vec<_> = vec![1, 2, 3];

Какова правильная терминология для подчеркивания в аннотации частичного типа? Меня интересуют как терминология ржавчины, так и терминология теории академического типа.

4b9b3361

Ответ 1

После некоторого копания кажется, что Vec<_> последовательно называют частичным типом (поэтому в let x: Vec<_> мы имеем аннотацию частичного типа, а Fn(String) -> _ - это частичная подпись типа), но _ в этом контексте измененно называется либо шаблоном типа, либо типом-заполнителем, а _ в грамматике типа может быть прочитан как токен для "вывести этот тип" (во время упомянутого ниже PR, TyInfer внутри компилятора).

Интересное чтение:

Интересная деталь из PR:

let x: _ = 5;
let x    = 5;

Две приведенные выше строки эквивалентны и оба анализируются как переменная x с типом TyInfer.

Ответ 2

Я смог найти часть официальной документации, где подчеркивание названо в контексте шаблонов, но я сомневаюсь, что это "строгое" name:

Шаблоны состоят из некоторой комбинации литералов, деструктивных массивов или конструкторов перечислений, структур и кортежей, спецификаций привязки переменных, подстановочных знаков (..) и заполнителей (_).

В книге приведено описание в глоссарии:

_: игнорируется привязка шаблонов (см. Шаблоны (игнорирование привязок)). Также используется для чтения целочисленных литералов (см. Ссылка (целые литералы)).

Я не смог найти определение, конкретно указывающее на аннотации частичного типа, но я думаю, что "placeholder" (или "placeholder" типа, в зависимости от контекста) не будет двусмысленным.

Ответ 3

В компиляторе он называется Infersyntax::ast, rustc::hir и rustc::ty)

Я думаю, что это именование несколько разумно, потому что эти _ заменяются свежими переменными вывода (типа), прежде чем делать вывод типа Hindley-Milner.