Conversões Implícitas

Rust não aplicará automaticamente conversões implícitas entre os tipos (ao contrário de C++). Você pode ver isso em um programa como este:

fn multiply(x: i16, y: i16) -> i16 {
    x * y
}

fn main() {
    let x: i8 = 15;
    let y: i16 = 1000;

    println!("{x} * {y} = {}", multiply(x, y));
}

Todos os tipos inteiros do Rust implementam os traits From<T> e Into<T> para nos deixar converter entre eles. O trait From<T> tem um único método from() e da mesma forma, o trait Into<T> tem um único método into(). A implementação desses traits é como um tipo expressa que pode ser convertido em outro tipo.

A biblioteca padrão tem uma implementação de From<i8> for i16, o que significa que podemos converter uma variável x do tipo i8 para um i16 chamando i16::from(x). Ou, mais simples, com x.into(), porque a implementação From<i8> for i16 cria automaticamente uma implementação de Into<i16> for i8.

O mesmo se aplica às suas próprias implementações de From para seus próprios tipos, logo é suficiente implementar apenas From para obter uma respectiva implementação Into automaticamente.

  1. Execute o programa acima e observe o erro de compilação.

  2. Atualize o código acima para utilizar into() para fazer a conversão.

  3. Mude os tipos de x e y para outros tipos (como f32, bool, i128) para ver quais tipos você pode converter para quais outros tipos. Experimente converter tipos pequenos em tipos grandes e vice-versa. Verifique a documentação da biblioteca padrão para ver se From<T> está implementado para os pares que você verificar.