Wnioskowanie typów
Rust sprawdzi, w jaki sposób zmienna jest używana do określenia typu:
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);
}
Ten slajd pokazuje, w jaki sposób kompilator Rusta wnioskuje o typach na podstawie ograniczeń nałożonych przez deklaracje i zastosowania zmiennych.
Bardzo ważne jest podkreślenie, że zmienne zadeklarowane w ten sposób nie są jakimś dynamicznym „dowolnym typem”, który może przechowywać dowolne dane. Kod maszynowy generowany przez taką deklarację jest identyczny z jawną deklaracją typu. Kompilator wykonuje to za nas i pomaga nam pisać bardziej zwięzły kod.
When nothing constrains the type of an integer literal, Rust defaults to i32. This sometimes appears as {integer} in error messages. Similarly, floating-point literals default to f64.
fn main() {
let x = 3.14;
let y = 20;
assert_eq!(x, y);
// ERROR: no implementation for `{float} == {integer}`
}