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.

Cómo ocultar la implementación de un rasgo en Rust.

Tengo un proyecto con su propio tipo de error, el cual se expone fuera del crate. Lo llamaremos MyErrorType. El proyecto en sí internamente depende de otro crate con su propio tipo de error. Lo llamaremos ForeignErrorType.

Con el fin de simplificar el código y hacerlo más legible, he creado la siguiente implementación del trait From:


impl From<ForeignErrorType> for MyErrorType {
...
}

Esto permite usar el operador de interrogación, ?, al tratar con tipos de error extranjeros sin necesidad de convertirlos en su lugar.

El problema es que la implementación del trait mencionado se expone fuera de mi crate. No quiero que los usuarios de mi crate dependan accidentalmente de la posibilidad de conversión de ForeignErrorType a MyErrorType.

Lo que he intentado hasta ahora: He puesto la implementación del trait mencionado en un módulo con visibilidad pub(crate). Esto sorprendentemente oculta todas las structs definidas en dicho módulo, pero deja la implementación del trait expuesta.

  • ¿Hay alguna manera de mantener privada mi implementación de From y no exponerla fuera del crate?
  • Probablemente estoy intentando obtener los beneficios del manejo de errores de una manera no idiomática. Si es así, ¿cuál es la manera adecuada de poder usar el operador de interrogación, ?, en tipos de error extranjeros sin exponerlos?
Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de mantener su implementación From privada y no exponerla fuera del archivo. Puede definir la implementación dentro de un módulo privado usando la palabra clave mod y luego volver a exportar la interfaz pública del módulo a través de la interfaz pública del archivo utilizando la sintaxis pub use.

    Por ejemplo:

    “`
    mod mi_modulo {
    use crate::TipoErrorExterno;
    use crate::MiTipoError;

    impl From<tipoerrorexterno> for MiTipoError {
        // detalles de la implementación aquí
    }
    
    pub fn foo() {
        // función pública que usa la implementación From
    }
    

    }

    // volver a exportar la interfaz pública de mi_modulo a través de la interfaz pública del archivo
    pub use mi_modulo::foo;

    De esta manera, los usuarios de su archivo no podrán acceder a los detalles de implementación de la implementación From, pero aún pueden usar la función foo que depende de ella.

    En cuanto a la segunda pregunta, no es necesariamente poco convencional usar el operador ? en los tipos de error externos, pero es importante asegurarse de que los tipos de error se manejen y conviertan correctamente al tipo de error del archivo antes de exponerlos al usuario. Esto se puede hacer utilizando el trait From como ya lo ha hecho, o utilizando otras técnicas de manejo de errores como el método map_err o la macro try.

Comments are closed.