Выведение типов
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);
}
Слайд показывает, что компилятор языка выводит неявно заданный тип значения переменной, основываясь на её объявлении и дальнейшем использовании.
Здесь очень важно отметить, что это отнюдь не динамическая типизация; тип есть и неизменен. Для переменных, объявленных таким образом, сгенерированный машинный код будет идентичен варианту с явным указанием типа. Компилятор лишь берёт на себя часть работы, позволяя писать более лаконичный код.
По умолчанию, в отсутствие ограничений, тип целочисленного литерала будет выведен как 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}`
}