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
Каковы правила вывода типа и вывода типа?