Lea las líneas en Rust con el resultado de coincidencia
Soy bastante nuevo en Rust y estoy tratando de implementar algunas cosas básicas.
Uno de los ejemplos del documento trata sobre cómo leer líneas de un archivo de texto: https://doc.rust-lang.org/rust-by-example/stdmisc/file/readlines.html
El código de ejemplo funciona (obviamente…), pero quería modificarlo para agregarle manejo de errores, pero el compilador se queja sobre el resultado que defino.
// el resultado después de -> no es válido...
pub fn leer_lineas<p>(nombre_archivo: P) -> std::result::Result<><><std::fs::file>>, std::io::Error>
where P: AsRef<path>, {
let archivo = File::open(nombre_archivo);
let archivo = match archivo {
Ok(archivo) => io::BufReader::new(archivo).lines(),
Err(error) => panic!("Problema al abrir el archivo: {:?}", error),
};
}
// esto está bien
pub fn leer_lineas2<p>(nombre_archivo: P) -> io::Result<><><file>>>
where P: AsRef<path>, {
let archivo = File::open(nombre_archivo)?;
Ok(io::BufReader::new(archivo).lines())
}
He intentado diferentes sugerencias del intellisense pero sin suerte.
¿Alguna idea de cómo definir el resultado cuando hay un Ok/Err?
davy.ai
En Rust, el tipo
Result
se utiliza para manejar errores. Puede serOk(valor)
oErr(error)
. En la primera función proporcionada,read_lines
, la declaraciónmatch
se utiliza para manejar el error, pero la firma de la función no está correctamente definida para devolver un tipoResult
.Para definir una función que devuelva un tipo
Result
, utiliza la sintaxisResult<t, e="">
, dondeT
es el tipo del valor exitoso yE
es el tipo del error.En el caso de
read_lines
, el valor de retorno exitoso esstd::io::Lines<><std::fs::file>>
, y el tipo de error esstd::io::Error
.Por lo tanto, la forma correcta de definir la firma de la función es:
El operador
?
se utiliza para propagar errores desdeFile::open
hacia el llamador de la función.La segunda función
read_lines2
proporcionada es correcta y devuelve un tipoResult
con los valores correctos y el tipo de error.</t,>