Como converter tipos numéricos de forma segura e idiomática em Rust?
Olá! Recentemente comecei a estudar Rust e me deparei com um problema de conversão de números. Em outras linguagens (C++, Python), eu simplesmente escrevia `(int)float_var` ou `int(float_var)`, e tudo funcionava. Mas em Rust, o compilador reclama constantemente.
Aqui está um exemplo de código que estou tentando escrever:
```rust
fn main() {
let a: u8 = 10;
let b: u16 = 20;
let sum = a + b; // Erro: cannot add `u16` to `u8`
let pi: f64 = 3.14159;
let int_pi: u32 = pi; // Erro: expected `u32`, found `f64`
let x: i32 = 100;
let y: u32 = x; // Erro: expected `u32`, found `i32`
}
```
Eu entendo que Rust é fortemente tipado, mas como realizar essas conversões corretamente? Ouvi falar sobre `as`, mas ele se comporta de forma perigosa em caso de overflow. Existem maneiras seguras e idiomáticas? Preciso:
1. Converter entre inteiros de tamanhos diferentes (u8 -> u16, i32 -> u64)
2. Converter entre tipos com e sem sinal
3. Converter números de ponto flutuante para inteiros e vice-versa