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
- El campo es privado, así que el constructor es la única puerta.
newdevuelveOptionoResultcuando la validación puede fallar.- El tipo entonces prueba el invariante en todas partes donde aparece.
Palabras clave y builtins usados aquí
NoneOptionSomeelsef64fnifimplletselfstaticstrstruct
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.
Paso 2 de 2 en Patrones de API; paso 11 de 12 en Módulos, pruebas y macros.