Rust 基础学习 Package,Crate,Module

26 阅读2分钟

Rust 项目构建的构建的过程引入了 packagcratemodule的概念,这些都属于 Rust 构建项目的基础概念,本文实体尽量将这些概念简化和便于理解。

package

还记得 cargo new hello_world_project这个命令吗?这里 hello_world_project其实就是一个pacakge。来让我们看下Package的定义:

Package(包)是一个用于分发、构建和管理Rust代码的基本单元。一个包包含一个或多个crate,并且每个包必须包含一个名为Cargo.toml的文件,该文件定义了包的元数据和依赖信息。

对于Javaer来说,Rust里面的 package有点类似 maven的项目概念

crate

还拿 hello_world_project举例吧,这里面的 src/main其实就是 一个 crate准确的说是一个二进制crate(binary crate),那么crate的概念到底是什么呢?

crate一个crate是代码的最小编译单元。一个crate可以由一个或多个文件组成,通常由一个根模块(root module)作为入口点。

还补充下 二进制Crate库Crate的概念区别:本质区别是,可独立运行的crate就可以成为 二进制Crate,反之就是 库Crate

现在再理解官网的几条规则就比较好理解了:

  • 包中至多 只能 包含一个库 crate(library crate);
  • 包中可以包含任意多个二进制 crate(binary crate);
  • 包中至少包含一个 crate,无论是库的还是二进制的。

crate的根:

src/main.rs:表示该crate是一个bin类型的crate

src/lib.rs:表示该crate是一个lib类型的crate

src/main.rs和src/lib.rs都是crate的根,也就是crate引用、rustc编译的入口。

Rust里面的所谓的 crate个人感觉就是所谓的 *.rs文件,但是官方文档没说,问了Chatgpt表示认可,初学先这么理解,后面再补充吧

mod

代码多了可以对代码以mod(文件/文件夹)为单位进行拆分,而不必把所有代码都写在src/lib.rs或者src/main.rs里。这个感念很好理解了,mod关键字定义部分就是可以成为mod。如下关键部分需要注意:

  • mod之间默认的私有,需要pub才能可见;Rust默认安全性要求,模块引用过程,如果不加pub,你就访问不了
  • 子mod可见父mod,父mod不可见子mod;这个好理解,大厅经理是了解大厅的情况的,反之就不行,这里是变成范式不要纠结。
日期更新说明
2024年5月26日初版