Что такое подписка на тип?

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

let closure_annotated = |value: i32| -> i32 { 
    temp: i32 = fun(5i32); //<-- Error 
    temp + value + 1
};
error: type ascription is experimental (see issue #23416)
             temp: i32 = fun(5i32); //<-- Error 
             ^~~~~~~~~

Я знаю, что эта проблема решается с помощью let, но может ли кто-нибудь объяснить, что такое "тип записи" и какое использование у нее есть?

Я нашел issue # 23416 и элементный элемент для типа ascription, но я не мог найти ничего, чтобы понять, что такое "тип записи" и какова его цель.

Ответ 1

Типовое присвоение - это возможность аннотировать выражение с типом, который мы хотим иметь. Тип заявки в Rust описан в RFC 803.

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

fn main() {
    println!("{:?}", "hello".chars().collect());
}

дает следующую ошибку:

<anon>:2:38: 2:47 error: unable to infer enough type information about `_`; type annotations or generic parameter binding required [E0282]
<anon>:2     println!("{:?}", "hello".chars().collect());
                                              ^~~~~~~~~

Это потому, что метод collect может возвращать любой тип, который реализует свойство FromIterator для тип iterator Item. С типом присваивания можно написать:

fn main() {
    println!("{:?}", "hello".chars().collect(): Vec<char>);
}

Вместо текущего (как и у Rust 1.7) способов устранения двусмысленности этого выражения:

fn main() {
    println!("{:?}", "hello".chars().collect::<Vec<char>>());
}

или

fn main() {
    let vec: Vec<char> = "hello".chars().collect();
    println!("{:?}", vec);
}