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

Как вывод типа Rust работает с несколькими операторами?

Rust выполняет вывод типа в довольно сложных ситуациях. Может ли кто-нибудь объяснить (или указать) правила, которые описывают, что можно и не может быть выведено?

Первый простой: тип привязки - тип связанного выражения:

let n = 10u32;

// Same as:
//   vvvvv
let n: u32 = 10u32;

Это более неожиданно для меня: общий параметр справа выводится из типа привязки слева:

let n: u32 = "10".parse().unwrap();

// same as:            vvvvvvv
let n: u32 = "10".parse::<u32>().unwrap();

Это также работает для "функций-членов" общих типов:

let b = Box::new(10u32);

// same as:
//        vvvvv      vvvvvvv
let b: Box<u32> = Box::<u32>::new(10u32);

Но самым странным из всех является вывод типа между операторами:

let v = Vec::new();   // no type!
v.push(10u32);        // apparently v is Vec<u32>?!
// v.push(10i32);     // type error

Каковы правила вывода типа и вывода типа?

4b9b3361