Learn
Rust/10-modules

模块与包管理

随着代码增长,需要模块(module) 来划分命名空间、控制可见性,并用 crate / workspace 组织更大的项目。

1. 用 mod 定义模块

mod 与可见性
mod network {
    pub fn connect() {
        println!("连接中...");
        status();
    }
 
    // 默认私有,仅模块内可见
    fn status() {
        println!("状态:已就绪");
    }
}
 
fn main() {
    network::connect();
    // network::status();  // 编译错误:private function
}
ℹ️默认私有

模块内项默认是 私有的(仅本模块及子模块可见)。加 pub 才对外暴露。这与「变量默认不可变」一样,都是 Rust「默认收紧」哲学的体现。

2. 用 use 引入路径

use 引入路径
mod geometry {
    pub mod shapes {
        pub fn area(w: f64, h: f64) -> f64 {
            w * h
        }
    }
}
 
use crate::geometry::shapes::area;
 
fn main() {
    println!("面积 = {}", area(3.0, 4.0));   // 不必写全路径
    // 也可用 as 改名:use ... as rect_area;
}

也可用 as 改名避免冲突:use std::io::Result as IoResult;。

3. 多文件模块

把模块拆到独立文件:

src/
  main.rs
  network.rs      // 在 main.rs 写: mod network;

或在 src/network/mod.rs 中组织子模块。Rust 2018 之后也支持 src/network.rs + src/network/ 目录并存。

4. crate 与可见性层级

  • crate:一个编译单元(库或二进制)。顶层 mod 在 lib.rs/main.rs。
  • pub(crate):仅当前 crate 内可见。
  • pub(in path):限定在某个路径下可见。
pub(crate) fn internal() {}    // 库内部共享,对外隐藏
💡pub 的细分粒度

pub、pub(crate)、pub(super)、pub(in crate::foo) 让你精确控制 API 边界,避免内部实现泄漏成公开接口。

5. workspace 多包

多个相关 crate 放在一个 workspace 共享 Cargo.lock 与 target/:

# 根 Cargo.toml
[workspace]
members = ["crates/core", "crates/cli"]
my-workspace/
  Cargo.toml
  crates/
    core/    # 库
    cli/     # 二进制,依赖 core
⚠️workspace 的共享依赖

workspace 内所有成员共用一份 Cargo.lock 与依赖解析,避免版本分裂。改一处依赖,全 workspace 生效。

6. 标准库常用路径

路径用途
std::collectionsVec/HashMap 等
std::fs文件操作
std::io输入输出
std::thread线程
🎯练习

把上一章的 Shape 与 area 放进一个 mod geometry { pub enum Shape {...} pub fn area(...) },在 main 里用 use 引入并调用。再给内部 helper 函数设为私有,验证外部无法访问。

小结

  • mod 划命名空间,pub 控制可见性,默认私有
  • use 简化路径;as 改名防冲突
  • pub(crate) 等细分粒度管理 API 边界
  • workspace 用 members 组织多 crate 并共享依赖
  • 下一章看常用集合类型 →