En Rust, los modificadores de visibilidad (pub, pub(crate), pub(super)) surgieron como un mecanismo para la encapsulación y el control claro del acceso a datos y funciones, que faltaba en C. La idea es limitar el ámbito de visibilidad de los elementos del módulo y proporcionar a los usuarios de la biblioteca solo lo que realmente necesitan.
La clave dificultad es que incluso si la propia estructura se declara como pública (pub), sus campos son privados por defecto. También surge a menudo la pregunta: ¿cómo organizar correctamente el acceso a estructuras y módulos anidados sin romper la encapsulación y sin hacer que la API sea “porosa” o, por el contrario, demasiado cerrada?
Para las estructuras, es necesario especificar por separado los modificadores de acceso para los campos. Al diseñar estructuras generadas automáticamente o tipos almacenados, es importante pensar cuidadosamente sobre qué partes deben ser accesibles y cuáles deben permanecer ocultas. Esta es una parte importante de la API y la arquitectura del código.
Ejemplo de código:
mod outer { pub struct Exposed { pub field: i32, hidden: bool, } } // El uso del campo "field" es accesible, // hidden no lo es. let e = outer::Exposed { field: 42, hidden: true }; println!("{}", e.field); // e.hidden // error de compilación
Características clave:
¿Puede una estructura declarada como pub ser completamente inaccesible fuera del módulo actual?
Sí, si todos los campos de la estructura permanecen privados, es pública solo por su nombre: no se puede crear o inicializar una instancia de la estructura fuera del módulo.
¿Puede un campo privado de una estructura volverse accesible a través de la herencia o de otra manera, eludiendo el sistema de modificadores?
No, en Rust no hay herencia clásica como en los lenguajes OOP. El acceso a los campos privados está controlado por el módulo y está sustancialmente restringido.
¿Qué sucederá si se crea una estructura con campos públicos, pero se declara el módulo como privado?
La estructura y sus campos no serán visibles fuera del módulo padre: los modificadores no trascienden el ámbito de visibilidad del módulo padre.
** Caso negativo
El usuario declaró una estructura pub, pero todos los campos permanecieron privados. Como resultado, el código externo no puede utilizarla correctamente, ni crear una instancia, ni obtener valores.
Pros:
Contras:
** Caso positivo
El usuario abrió solo los campos necesarios a través de pub, manteniendo detalles sensibles como privados. Se utilizan getters/setters para el acceso.
Pros:
Contras: