es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    En Rust, el tipo Result se utiliza para manejar errores. Puede ser Ok(valor) o Err(error). En la primera función proporcionada, read_lines, la declaración match se utiliza para manejar el error, pero la firma de la función no está correctamente definida para devolver un tipo Result.

    Para definir una función que devuelva un tipo Result, utiliza la sintaxis Result<t, e="">, donde T es el tipo del valor exitoso y E es el tipo del error.

    En el caso de read_lines, el valor de retorno exitoso es std::io::Lines<><std::fs::file>>, y el tipo de error es std::io::Error.

    Por lo tanto, la forma correcta de definir la firma de la función es:

    pub fn read_lines<p>(filename: P) -> std::result::Result<><><std::fs::file>>, std::io::Error>
    where P: AsRef<path>, {
        let file = File::open(filename)?;
        Ok(io::BufReader::new(file).lines())
    }
    

    El operador ? se utiliza para propagar errores desde File::open hacia el llamador de la función.

    La segunda función read_lines2 proporcionada es correcta y devuelve un tipo Result con los valores correctos y el tipo de error.</t,>

Comments are closed.