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

模块与 Crate:代码组织方式

你将学到什么: Rust 的模块系统如何对应 C# 的命名空间与程序集,pub 可见性规则,基于文件的模块组织方式,以及 crate 与 .NET 程序集之间的映射关系。

难度: 初级

理解 Rust 的模块系统是组织代码的基础。对于 C# 开发者而言,这相当于理解命名空间、项目和解决方案之间的关系。


模块 vs 命名空间

在 C# 中,命名空间与文件系统是解耦的。而在 Rust 中,模块的层级结构(Module Hierarchy)通常就是文件系统的层级。

C# 命名空间

namespace MyApp.Models {
    public class User { }
}

Rust 模块

在 Rust 中,你需要使用 mod 关键字显式地声明模块。

#![allow(unused)]
fn main() {
// 在 lib.rs 或 main.rs 中
pub mod models; 

// 在 models.rs 中
pub struct User { }
}

可见性修饰符 (Visibility Modifiers)

Rust 的可见性修饰符支持比 C# 更加“细腻”和“嵌套”的控制。

修饰符C# 对应物Rust 含义
pubpublic对外部所有人可见
(默认)private仅在当前模块内可见
pub(crate)internal在整个 crate(程序集)内可见
pub(super)仅对父级模块可见

Crate:编译的基本单元

Crate 是 Rust 代码的基本单位,类似于 .NET 中的 程序集 (Assembly)(即 .dll.exe 文件)。

  • Binary Crate (二进制 crate):一个独立的控制台程序(包含 main.rs)。
  • Library Crate (库 crate):可复用的库代码(包含 lib.rs)。

Cargo.toml (对应 .csproj)

[package]
name = "my_app"
version = "0.1.0"

[dependencies]
serde = "1.0" # 类似于 NuGet 依赖引用

Workspace (对应 .sln)

一个 Workspace 允许你在单一目录下管理多个相关的 crate。

[workspace]
members = [
    "web_api",
    "business_logic",
    "data_layer",
]

C# 开发者总结表

C# 概念Rust 对应物
命名空间 (Namespace)mod (模块)
项目 (.csproj)Package (出现在 Cargo.toml 中)
程序集 (.dll)Crate
解决方案 (.sln)Workspace
NuGetcrates.io

练习:设计模块树

挑战: 组织一个包含 servicesmodels 模块的项目。确保 AuthService 是公开的,而 TokenStoreservices 模块内部可见但在外部私有。

#![allow(unused)]
fn main() {
// lib.rs
pub mod models;
pub mod services;

// services/mod.rs
pub mod auth_service;
mod token_store; // 仅对 services 模块私有
}

关键理解: 显式地声明模块使得代码文件之间的引用关系变得清晰透明。无论对开发者还是编译器来说,这都更易于进行依赖管理。