Skip to content

Visibility and pub

In Zolo, everything not marked with pub is private to the file where it was declared. Another module that imports the file only sees the public items — functions, constants, structs, enums, traits, and newtypes all follow the same rule.

The support module lib_demo.zolo illustrates this well: greet, add, sub, get_pi, and VERSION are public; internal_helper has no pub and remains invisible from outside:

Only items marked pub appear in the use list. Trying to import internal_helper would cause a compile error.

04-pub-vs-private.zolo
Playground
// Feature: visibility — `pub` exports, no `pub` is private
// Syntax: `pub fn`, `pub const`, `pub struct`, etc. make the
// item visible to other modules. Without `pub`, it is restricted to
// the file.
// When to use: encapsulate internal details, expose only the API.

mod lib_demo

// Only the public API is importable.
use lib_demo::{greet, add, get_pi, VERSION}

fn main() {
  greet("public api")
  print("add(1,2) = {add(1, 2)}")
  print("pi = {get_pi()}")
  print("version = {VERSION}")
  // expected:
  // Hello, public api!
  // add(1,2) = 3
  // pi = 3.14159
  // version = 1.0.0

  // Note: `internal_helper` is in lib_demo.zolo WITHOUT `pub`,
  // so it cannot be imported or called from here.
  // Trying `use lib_demo::internal_helper` or
  // `lib_demo::internal_helper()` is a design error — the
  // function belongs only to the module.
}

The rule is simple: if you want other files to use an item, add pub. If it is an implementation detail, leave it out — the compiler will reject any attempt at external access.

pub const VERSION exports the constant. const VERSION (without pub) would be hidden — even though it is in lib_demo.zolo, no other file could reference it.

See also

enespt-br