Виведення типів

Rust перевірить, як використовується змінна для визначення типу:

fn takes_u32(x: u32) {
    println!("u32: {x}");
}

fn takes_i8(y: i8) {
    println!("i8: {y}");
}

fn main() {
    let x = 10;
    let y = 20;

    takes_u32(x);
    takes_i8(y);
    // takes_u32(y);
}
This slide should take about 3 minutes.

На цьому слайді показано, як компілятор Rust виводить типи на основі обмежень, заданих оголошеннями змінних та їх використанням.

Дуже важливо підкреслити, що змінні, оголошені таким чином, не належать до якогось динамічного «будь-якого типу», який може містити будь-які дані. Машинний код, згенерований такою декларацією, ідентичний явному оголошенню типу. Компілятор виконує роботу за нас і допомагає нам писати більш стислий код.

Якщо тип цілочисельного літерала не обмежено, Rust за замовчуванням використовує тип i32. Іноді у повідомленнях про помилки це позначається як {integer}. Подібно до цього, літерали з плаваючою комою за замовчуванням мають тип f64.

fn main() {
    let x = 3.14;
    let y = 20;
    assert_eq!(x, y);
    // ПОМИЛКА: немає реалізації для `{float} == {integer}`
}