Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

English Original

8. Crate 与 模块 🟢

你将学到:

  • moduse 关键字 vs Python 的 import
  • 显式可见性 (pub) vs Python 基于约定的隐私策略
  • Cargo.tomlpyproject.toml 的对应关系
  • 工作区 (Workspaces):Rust 原生支持的单仓 (Monorepo) 模式

Rust 模块 vs Python 包

概念PythonRust
模块 = 文件✅ 自动识别必须显式用 mod 声明
包 = 目录__init__.pymod.rs (或特定的入口文件)
默认是否公开✅ 全部公开默认私有
使其公开_前缀 约定pub 关键字
导入语法from x import yuse x::y;

可见性 — 默认私有

在 Python 中,“私有”只是以 _ 开头的绅士协议。而在 Rust 中,编译器会强制执行可见性规则。

#![allow(unused)]
fn main() {
pub struct User {
    pub name: String,      // 公开:任何人均可访问
    age: i32,              // 私有:仅限本模块访问
}

impl User {
    pub fn new(name: &str, age: i32) -> Self {
        User { name: name.to_string(), age }
    }
}

// 在模块外部调用:
let u = User::new("李雷", 30);
println!("{}", u.name); // ✅ 正常运行
// println!("{}", u.age);  // ❌ 编译报错:该字段为私有!
}

Crate vs PyPI 包

Python (PyPI)

pip install requests
# 版本记录在 requirements.txt 或 poetry.lock

Rust (crates.io)

cargo add reqwest
# 依赖记录在 Cargo.toml 中 (自动在 Cargo.lock 中锁定版本)

给 Python 开发者的常用 Crate 映射

Python 库Rust 对应 Crate用途
requestsreqwestHTTP 客户端
pydanticserde序列化/验证
jsonserde_jsonJSON 解析
asynciotokio异步运行时
fastapiaxum / actix-webWeb 框架
clickclap命令行参数解析

工作区 (Workspaces)

Rust 原生支持单仓 (Monorepo) 模型。工作区内的所有项目共用一个 Cargo.lock 文件,确保整个项目依赖版本的绝对一致性。

# 根目录下的 Cargo.toml
[workspace]
members = ["api", "core", "cli"]

练习

🏋️ 练习:模块可见性 (点击展开)

挑战:判断以下 main() 函数中的哪一行会编译失败?

mod internal {
    fn private() {}
    pub fn public() {}
}

fn main() {
    internal::public();
    internal::private();
}
参考答案

internal::private() 会编译失败。在 Rust 中,如果没有显式标记为 pub,该项内容对其所属模块之外的一切都是不可见的。