📦 圖解 Rust 代碼組織層級
1?? 箱子(Crate)——最小的編譯單元
-
類型:
- 🎁 二進制箱子:可執行程序(如命令行工具),必須有
main()
函數。- 示例:
src/main.rs
- 示例:
- 📚 庫箱子:共享功能(如
rand
庫),沒有main()
。- 示例:
src/lib.rs
- 示例:
- 🎁 二進制箱子:可執行程序(如命令行工具),必須有
-
特點:
- 編譯器每次處理 一個箱子(即使你直接編譯單個文件)。
- 箱子根(Crate Root)是編譯器開始讀取的入口文件(如
main.rs
或lib.rs
)。
2?? 包(Package)——管理箱子的容器
-
規則:
- 一個包 必須包含至少一個箱子(二進制或庫)。
- 一個包 最多只能有一個庫箱子。
- 一個包可以有 多個二進制箱子(通過
src/bin/*.rs
添加)。
-
示例:
my-project/ ├── Cargo.toml # 包的配置文件 └── src/├── main.rs # 二進制箱子(默認與包同名)└── lib.rs # 庫箱子(如果存在)└── bin/ # 額外二進制箱子├── tool1.rs└── tool2.rs
🛠? 創建包時的自動結構
當你運行 cargo new
:
-
二進制包:
cargo new my-app
生成:
my-app/ ├── Cargo.toml └── src/└── main.rs # 二進制箱子入口
-
庫包:
cargo new my-lib --lib
生成:
my-lib/ ├── Cargo.toml └── src/└── lib.rs # 庫箱子入口
🌰 實際案例對比
概念 | 類比 | 示例 |
---|---|---|
箱子 | 單個“代碼盒子” | main.rs 或 lib.rs |
包 | 裝多個盒子的“快遞” | 整個項目目錄 |
? 常見疑問
-
Q:為什么要有箱子和包的分層?
A:箱子是編譯的最小單元(Rust 的編譯優化以箱子為單位),包是方便人類管理的邏輯單元(通過Cargo.toml
統一配置)。 -
Q:如何共享代碼?
A:將公共代碼放在lib.rs
中,二進制箱子通過use my-lib;
調用。