Modismo de tipos nuevos

El modismo newtype da garantías de tiempo de compilación de que se proporciona el tipo correcto de valor a un programa.

Por ejemplo, una función de verificación de edad que verifica la edad en años, debe recibir un valor de tipo Agnos.

struct Agnos(i64);

struct Dias(i64);

impl Agnos {
    pub fn en_dias(&self) -> Dias {
        Dias(self.0 * 365)
    }
}

impl Dias {
    /// truncates partial years
    pub fn en_agnos(&self) -> Agnos {
        Agnos(self.0 / 365)
    }
}

fn suficientemente_viejo(edad: &Agnos) -> bool {
    edad.0 >= 18
}

fn main() {
    let edad = Agnos(5);
    let edad_dias = edad.en_dias();
    println!("Suficientemente viejo {}", suficientemente_viejo(&edad));
    println!("Suficientemente viejo {}", suficientemente_viejo(&edad_dias.en_agnos()));
    // println!("Suficientemente viejo {}", suficientemente_viejo(&edad_days));
}

Descomenta la última declaración impresa para observar que el tipo proporcionado debe ser Agnos.

Para obtener el valor del newtype como tipo base, puedes usar la sintaxis de tupla o desestructuración de la siguiente manera:

struct Agnos(i64);

fn main() {
    let agnos = Agnos(42);
    let agnos_como_tipo_elemental_1: i64 = agnos.0; // Tuple
    let Agnos(agnos_como_tipo_elemental_2) = agnos; // Destructuring
}

Ve también

structs