Las conversiones From impulsan ? en Rust
Implementa From para cada error subyacente y ? convierte por su cuenta.
use std::fmt;
use std::num::ParseIntError;
#[derive(Debug)]
enum LoadError {
BadNumber(ParseIntError),
Empty,
}
impl From<ParseIntError> for LoadError {
fn from(e: ParseIntError) -> Self {
LoadError::BadNumber(e)
}
}
impl fmt::Display for LoadError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
LoadError::BadNumber(e) => write!(f, "not a number: {e}"),
LoadError::Empty => write!(f, "nothing to load"),
}
}
}
fn total(raw: &str) -> Result<i32, LoadError> {
if raw.trim().is_empty() {
return Err(LoadError::Empty);
}
let mut sum = 0;
for part in raw.split(',') {
sum += part.trim().parse::<i32>()?;
}
Ok(sum)
}
fn main() {
println!("{:?}", total("1, 2, 3"));
println!("{}", total("1, x").unwrap_err());
println!("{}", total(" ").unwrap_err());
}
Cómo funciona
?llama aFrom::fromsobre el error que retorna.- Basta un impl de
Frompor cada tipo de error ajeno. - La función entonces mezcla fuentes de error con libertad.
Palabras clave y builtins usados aquí
ErrFromOkResultenumfnfori32ifimplinletmatchmutreturnselfstruse
El intento, en números
- Líneas
- 40
- Caracteres a escribir
- 775
- Tokens
- 247
- Ritmo de tres estrellas
- 105 tpm
Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 141 segundos.
Paso 3 de 5 en Tus propios tipos de error; paso 10 de 15 en Manejo de errores.