Движок вывода типов весьма умён. Он делает куда больше, чем просто смотрит на тип r-value при инициализации. Он также смотрит, как используется значение посли инициализации, чтобы вывести его тип. Вот расширенный пример вывода типов:
fn main() { // Благодаря выведению типов компилятор знает, `elem` имеет тип - u8. let elem = 5u8; // Создадим пустой вектор (расширяемый массив). let mut vec = Vec::new(); // В данном месте компилятор не знает точный тип `vec`, он лишь знает, // что это вектор чего-то там (`Vec<_>`). // Добавляем `elem` в вектор. vec.push(elem); // Ага! Теперь компилятор знает, что `vec` - это вектор, который хранит в себе тип `u8` // (`Vec<u8>`) // ЗАДАНИЕ ^ Попробуйте закомментировать строку `vec.push(elem)` println!("{:?}", vec); }
Не потребовалось никакой аннотации типов переменных, компилятор счастлив, как и программист!