Pular para o conteúdo

Módulos inline e visibilidade granular

Nesta página

Além de módulos em arquivos separados, Zolo permite declarar um módulo inline dentro do próprio arquivo com mod nome { ... }. Isso é útil para agrupar funções relacionadas sem criar um arquivo extra.

O use ... as nome (renomeação) cria um alias local — conveniente quando o nome original é longo ou colide com outro nome no escopo. E os modificadores de visibilidade pub(mod) e pub(crate) permitem controle mais fino do que o simples pub:

  • pub(mod) — visível para irmãos dentro do mesmo módulo inline, mas invisível fora dele.
  • pub(crate) — visível para todo o crate (equivale a pub hoje, mas o parser preserva a informação para fases futuras do compilador).

mod arith { ... } é declarado inline; use std::math::{abs as absolute, sign} renomeia durante a importação; pub(mod) secret_factor é usável por triple (mesmo módulo) mas não pelo código externo.

09-inline-mod-use-rename-pub-scope.zolo
Playground
// 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

}

Desafio

Tente chamar arith.secret_factor() a partir de main. O que o compilador responde? Agora mude pub(mod) para pub e veja a diferença.

Veja também

Buscar no Zolo

9 resultados

enespt-br