Módulos inline y visibilidad granular
En esta página
Además de módulos en archivos separados, Zolo permite declarar un módulo
inline dentro del propio archivo con mod nombre { ... }. Es útil para
agrupar funciones relacionadas sin crear un archivo extra.
use ... as nombre (renombrado) crea un alias local — conveniente cuando el
nombre original es largo o colisiona con otro nombre en el ámbito. Los
modificadores de visibilidad pub(mod) y pub(crate) permiten un control más
fino que el simple pub:
pub(mod)— visible para los miembros del mismo módulo inline, pero invisible fuera de él.pub(crate)— visible en todo el crate (equivale apubhoy, pero el parser preserva la información para fases futuras del compilador).
mod arith { ... } se declara inline; use std::math::{abs as absolute, sign} renombra durante la importación; pub(mod) secret_factor es usable por
triple (mismo módulo) pero no por el código externo.
// Feature: inline `mod foo { ... }`, `use ... as ...` rename, granular
// visibility (`pub(crate)`, `pub(super)`, `pub(mod)`).
// See `specs/mod-namespace-innovations.html` (cherry-picks C1, C4).
use std::math::{abs as absolute, sign}
// Inline module — declared inside this file, not loaded from disk.
mod arith {
pub fn add(a: int, b: int) -> int { a + b }
pub fn mul(a: int, b: int) -> int { a * b }
// pub(mod) keeps the item visible to siblings inside `arith` but
// hidden to the outside file.
pub(mod) fn secret_factor() -> int { 3 }
// pub(crate) is currently equivalent to `pub` for exports — the
// tag is preserved by the parser and printed by the formatter so
// future resolver phases can enforce crate-level scoping.
pub(crate) fn triple(x: int) -> int { x * secret_factor() }
}
// Bring two items in with renames; the alias becomes the local name.
fn main() {
print("arith.add(2,3) = {arith.add(2, 3)}") // 5
print("arith.mul(2,3) = {arith.mul(2, 3)}") // 6
print("arith.triple(4) = {arith.triple(4)}") // 12 (uses secret_factor)
print("absolute(-7) = {absolute(-7)}") // 7
print("sign(-9) = {sign(-9)}") // -1
}
Desafío
Intenta llamar a arith.secret_factor() desde main. ¿Qué responde el
compilador? Ahora cambia pub(mod) por pub y observa la diferencia.
Consulta también