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结构体的字段仍然是私有的,除非分别将每个字段标记为pubpub枚举会公开所有变体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 反馈 — 无需本地设置。
此课程中的所有课时
- 模块与 mod
- pub 与可见性
- use 与路径
- Crate 与 Crate 根