Inferência de Tipo
Rust verá como a variável é usada para determinar o tipo:
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);
}
Este slide demonstra como o compilador Rust infere tipos com base em restrições dadas por declarações e usos de variáveis.
É muito importante enfatizar que variáveis declaradas assim não são de um tipo dinâmico “qualquer tipo” que possa armazenar quaisquer dados. O código de máquina gerado por tal declaração é idêntico à declaração explícita de um tipo. O compilador faz o trabalho para nós e nos ajuda a escrever um código mais conciso.
Quando nada restringe o tipo de um literal inteiro, Rust assume i32. Isso às vezes aparece como {integer} nas mensagens de erro. Da mesma forma, os literais de ponto flutuante assumem f64.
fn main() {
let x = 3.14;
let y = 20;
assert_eq!(x, y);
// ERRO: nenhuma implementação para `{float} == {integer}`
}