Visibilidad de estructuras

Las estructuras tienen un nivel extra de visibilidad con sus campos. La visibilidad predeterminada es privada y se puede anular con el modificador pub. Esta visibilidad solo importa cuando se accede a una estructura desde fuera del módulo donde está definida y tiene el objetivo de ocultar información (encapsulamiento).

mod mi {
    // Una estructura pública con un campo público de tipo genérico `T`
    pub struct CajaAbierta<T> {
        pub contenidos: T,
    }

    // Una estructura pública con un campo privado de tipo genérico `T`
    #[allow(dead_code)]
    pub struct CajaCerrada<T> {
        contenidos: T,
    }

    impl<T> CajaCerrada<T> {
        // Un método constructor público
        pub fn new(contenidos: T) -> CajaCerrada<T> {
            CajaCerrada {
                contenidos: contenidos,
            }
        }
    }
}

fn main() {
    // Las estructuras públicas con campos públicos se pueden construir como de
    // costumbre
    let caja_abierta = mi::CajaAbierta { contenidos: "información pública" };

    // y se puede acceder a sus campos de manera normal.
    println!("La caja abierta contiene: {}", caja_abierta.contenidos);

    // Las estructuras públicas con campos privados no se pueden construir utilizando
    // nombres de campo. ¡Error! CajaCerrada tiene campos privados
    //let caja_cerrada = mi::CajaCerrada { contenidos: "información clasificada" };
    // TODO ^ Intenta descomentar esta línea

    // Sin embargo, las estructuras con campos privados se pueden crear utilizando
    // constructores públicos.
    let _caja_cerrada = mi::CajaCerrada::new("información clasificada");

    // y no se puede acceder a los campos privados de una estructura pública.
    // ¡Error! El campo `contenidos` es privado
    //println!("La caja cerrada contiene: {}", _caja_cerrada.contenidos);
    // TODO ^ Intenta descomentar esta línea
}

Ve también:

métodos