Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Выведение типов

Rust анализует использование переменной для определения её типа:

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

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.

Слайд показывает, что компилятор языка выводит неявно заданный тип значения переменной, основываясь на её объявлении и дальнейшем использовании.

Здесь очень важно отметить, что это отнюдь не динамическая типизация; тип есть и неизменен. Для переменных, объявленных таким образом, сгенерированный машинный код будет идентичен варианту с явным указанием типа. Компилятор лишь берёт на себя часть работы, позволяя писать более лаконичный код.

По умолчанию, в отсутствие ограничений, тип целочисленного литерала будет выведен как i32. В сообщениях об ошибках он иногда отображается как {integer}. Аналогично, умолчание для литералов чисел с плавающей точкой — f64

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let x = 3.14;
    let y = 20;
    assert_eq!(x, y);
    // ОШИБКА: no implementation for `{float} == {integer}`
}