typestar

Los newtypes sostienen invariantes en Rust

Envuelve un primitivo para que un valor inválido no pueda construirse en absoluto.

#[derive(Debug, Clone, Copy, PartialEq)]
struct Accuracy(f64);

impl Accuracy {
    fn new(value: f64) -> Option<Accuracy> {
        if (0.0..=100.0).contains(&value) {
            Some(Accuracy(value))
        } else {
            None
        }
    }

    fn value(&self) -> f64 {
        self.0
    }
}

fn grade(a: Accuracy) -> &'static str {
    if a.value() >= 97.0 {
        "clean"
    } else {
        "keep practicing"
    }
}

fn main() {
    let ok = Accuracy::new(98.5).unwrap();
    println!("{:?} {}", ok, grade(ok));
    println!("{:?}", Accuracy::new(140.0));
}

Cómo funciona

  1. El campo es privado, así que el constructor es la única puerta.
  2. new devuelve Option o Result cuando la validación puede fallar.
  3. El tipo entonces prueba el invariante en todas partes donde aparece.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
30
Caracteres a escribir
466
Tokens
148
Ritmo de tres estrellas
110 tpm

Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 81 segundos.

Escribe este fragmento

Paso 2 de 2 en Patrones de API; paso 11 de 12 en Módulos, pruebas y macros.

← Anterior Siguiente →