Visibilidade & Privacidade
Itens são privados por padrão. pub expõe entre crates; formas restritas limitam o escopo.
Receita
pub struct Api {
pub version: u32,
secret: String,
}
impl Api {
pub fn new(secret: String) -> Self {
Self { version: 1, secret }
}
}Quando usar isso: Encapsular invariantes - campos privados, construtores controlados.
Exemplo em Funcionamento
mod internal {
pub(crate) fn helper() {}
pub(super) fn parent_only() {}
}
pub fn public_api() {
internal::helper();
}O que isso demonstra:
pub(crate)visível em todo o cratepub(super)apenas no módulo pai- Privado por padrão dentro do módulo
Mergulho Profundo
Visibilidade de caminho customizado pub(in path) (Rust 2018+). Campos privados de struct com tipo público são aceitáveis se no mesmo crate, os padrões diferem para consumidores.
Armadilhas
- Campos privados de
pub struct- Crates externos não podem construir sempub fn. Correção: Construtor. - Confusão de
pub usepara reexportação - Esconde o caminho real. Correção: Documentar o prelúdio. - Excesso de
pub- Vaza detalhes internos. Correção: Usarpub(crate)para APIs internas por padrão. - Módulos de teste precisam de
pub- Ou#[cfg(test)]no mesmo módulo. - Privacidade exportada por macro -
#[macro_export]é a raiz pública do crate.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
pub(crate) | API Interna | Precisa de uso externo |
#[doc(hidden)] | Ocultar documentação, mas público | Privacidade real necessária |
Módulo de trait sealed | Limitar implementações | Trait aberto |
FAQs
`pub(crate)` vs `pub`?
Visibilidade em todo o crate vs. mundo.`pub(super)`?
Visibilidade no módulo pai.`pub(in self::a)`?
Caminho restrito.Módulo privado?
`mod foo;` não é `pub` - itens filhos ainda podem ser `pub use`.`ffi pub`?
`extern` precisa de símbolos `pub`.Visibilidade de teste?
Testes no mesmo módulo são privados.Exportar para WASM?
`wasm_bindgen` expõe `pub fns`.Lint `missing_docs`?
Em itens `pub`.Semver?
API `pub` é um contrato estável.Encapsulamento?
Métodos, não campos.Relacionados
- Noções Básicas de Módulos
- Projetando uma API Pública
- Melhores Práticas para Structs & Enums
- use & Caminhos
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.