Conversiones Implícitas

Rust no aplicará automáticamente conversiones implícitas entre tipos (a diferencia de C++). Puedes ver un ejemplo de esto en el siguiente programa:

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 los tipos de enteros de Rust implementan los traits From<T> y Into<T> para permitirnos realizar conversiones entre ellos. El trait From<T> tiene un único método from() y, del mismo modo, el trait Into<T> tiene un único método into(). Un tipo expresa que se puede convertir en otro tipo implementando estos traits.

La biblioteca estándar implementa From<i8> for i16, lo que significa que podemos convertir una variable x del tipo i8 a i16 llamando a i16::from(x). O, más sencillo, con x.into(), ya que la implementación de From<i8> for i16 crea automáticamente una implementación de Into<i16> for i8.

Lo mismo se aplica a tus implementaciones From para tus propios tipos, por lo que basta con implementar From para obtener la respectiva implementación Into de forma automática.

  1. Ejecuta el programa anterior y observa el error del compilador.

  2. Actualiza el código anterior para usar into() y realizar la conversión.

  3. Cambia los tipos de x e y a otros elementos (por ejemplo, f32, bool, i128) para ver qué tipos puedes convertir. Prueba a convertir tipos pequeños en tipos grandes y viceversa. Consulta la documentación de la biblioteca estándar para comprobar si se ha implementado From<T> en los pares que elijas.