0Pricing
Learn Rust Coding · 课时

pub 与可见性

控制访问权限

pub 与可见性 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。

默认私有

在 Rust 中,模块内的所有内容默认都是私有的。除非使用pub明确公开,否则其他模块无法访问它们。

这种安全的默认设置会隐藏实现细节,只有在您有意公开时才会将其暴露出来。

pub 函数

将函数标记为pub后,就可以从其模块外部调用它。没有这个标记,调用将无法通过编译。

mod math {
    pub fn square(x: i32) -> i32 {
        x * x
    }
}

fn main() {
    println!("{}", math::square(5));
}

隐藏私有辅助函数

您可以将内部辅助函数保持为私有,同时公开公共 API。公共函数可以调用私有函数,但外部代码无法调用它。

mod math {
    fn double(x: i32) -> i32 { x * 2 }
    pub fn quadruple(x: i32) -> i32 { double(double(x)) }
}

fn main() {
    println!("{}", math::quadruple(3));
}

pub 结构体隐藏字段

将结构体标记为pub会公开该类型,但其中的字段仍然是私有的,除非分别将每个字段也标记为pub。

这样您就可以控制结构体的创建和修改方式。

mod model {
    pub struct User {
        pub name: String,
        age: u32,
    }
    impl User {
        pub fn new(name: String, age: u32) -> User {
            User { name, age }
        }
        pub fn age(&self) -> u32 { self.age }
    }
}

fn main() {
    let u = model::User::new(String::from("Sam"), 28);
    println!("{} is {}", u.name, u.age());
}

为什么要隐藏字段?

私有字段可以保证不变量。调用者必须使用您提供的构造函数和方法,因此您可以验证输入,并且之后更改内部布局而不会破坏用户的代码。

pub 枚举公开所有内容

与结构体不同,pub枚举会自动公开其所有变体。变体没有单独的可见性设置。

mod traffic {
    pub enum Light {
        Red,
        Yellow,
        Green,
    }
}

fn main() {
    let l = traffic::Light::Green;
    let go = matches!(l, traffic::Light::Green);
    println!("go = {}", go);
}

pub(crate):整个包可见

pub(crate)会让项目在同一个包中的任何位置可见,但依赖您项目的外部包无法访问它。

它非常适合用于在多个模块之间共享的内部 API。

mod config {
    pub(crate) fn default_port() -> u16 {
        8080
    }
}

fn main() {
    println!("{}", config::default_port());
}

pub(super):仅父模块可见

pub(super)只会将项目公开给父模块。它授予的访问范围比完整的pub更窄。

mod outer {
    pub fn run() {
        inner::helper();
    }
    mod inner {
        pub(super) fn helper() {
            println!("visible to parent only");
        }
    }
}

fn main() {
    outer::run();
}

使用 pub use 重新导出

pub use会重新导出项目,让调用者可以通过更短或更方便的路径访问它。这样可以构建简洁的公共 API。

mod deep {
    pub mod nested {
        pub fn ping() {
            println!("pong");
        }
    }
    pub use nested::ping;
}

fn main() {
    deep::ping();
}

设计公共 API

只公开完成任务所需的最小接口。将辅助函数保持为私有,通过方法隐藏结构体字段,并使用pub(crate)实现内部共享。

紧凑的 API 更容易演进,也不容易破坏用户的代码。

可见性级别总结

从限制最少到限制最多:

  • 默认(仅模块私有)
  • pub(super) — 对父模块可见
  • pub(crate) — 对整个包可见
  • pub — 对所有位置可见

快速检查

测试您对可见性的理解。

回顾

您已经学会控制访问权限:

  • 项目默认是私有的;pub会将其公开
  • pub结构体的字段仍然是私有的,除非分别将每个字段标记为pub
  • pub枚举会公开所有变体
  • pub(crate)和pub(super)提供更精细的控制
  • pub use会重新导出项目,以构建简洁的 API

常见问题解答

「pub 与可见性」课时是免费的吗?

是的 — 「pub 与可见性」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。

「pub 与可见性」这节课中我会学到什么?

控制访问权限 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn Rust Coding 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「pub 与可见性」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn Rust Coding 课中编写并运行代码吗?

能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 模块与 mod
  2. pub 与可见性
  3. use 与路径
  4. Crate 与 Crate 根
← 返回 Learn Rust Coding