Visibilidade de Campos de Structs em Rust

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Neste laboratório, aprendemos sobre a visibilidade de structs em Rust e como isso afeta a acessibilidade de seus campos.

Nota: Se o laboratório não especificar um nome de arquivo, você pode usar qualquer nome de arquivo que desejar. Por exemplo, você pode usar main.rs, compilar e executar com rustc main.rs && ./main.

Visibilidade de Structs

Structs possuem um nível extra de visibilidade em relação aos seus campos. A visibilidade padrão é privada, e pode ser alterada com o modificador pub. Essa visibilidade só importa quando um struct é acessado de fora do módulo onde é definido, e tem o objetivo de esconder informações (encapsulamento).

mod my {
    // Um struct público com um campo público de tipo genérico `T`
    pub struct OpenBox<T> {
        pub contents: T,
    }

    // Um struct público com um campo privado de tipo genérico `T`
    pub struct ClosedBox<T> {
        contents: T,
    }

    impl<T> ClosedBox<T> {
        // Um método construtor público
        pub fn new(contents: T) -> ClosedBox<T> {
            ClosedBox {
                contents: contents,
            }
        }
    }
}

fn main() {
    // Structs públicos com campos públicos podem ser criados normalmente
    let open_box = my::OpenBox { contents: "informação pública" };

    // e seus campos podem ser acessados normalmente.
    println!("A caixa aberta contém: {}", open_box.contents);

    // Structs públicos com campos privados não podem ser criados usando nomes de campos.
    // Erro! `ClosedBox` possui campos privados
    //let closed_box = my::ClosedBox { contents: "informação classificada" };
    // TODO ^ Tente descomentar esta linha

    // No entanto, structs com campos privados podem ser criados usando
    // construtores públicos
    let _closed_box = my::ClosedBox::new("informação classificada");

    // e os campos privados de um struct público não podem ser acessados.
    // Erro! O campo `contents` é privado
    //println!("A caixa fechada contém: {}", _closed_box.contents);
    // TODO ^ Tente descomentar esta linha
}

Resumo

Parabéns! Você concluiu o laboratório de Visibilidade de Structs. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.