箱(Crate)
“箱”是二进制程序文件或者库文件,存在于”包”中。
“箱”是树状结构的,它的树根是编译器开始运行时编译的源文件所编译的程序。
注意:”二进制程序文件”不一定是”二进制可执行文件”,只能确定是是包含目标机器语言的文件,文件格式随编译环境的不同而不同。
可以作为三方库进行分发,也可以生成可执行文件进行运行。
rust 有两种 crate,分别是 lib 和 bin。 crate 有两个入口:
- src/main.rs:表示该crate 是一个bin 类型的 crate
- src/lib.rs:表示该 crate 是一个 lib 类型的crate
包(Package)
一个工程就是一个 package。
当我们使用 Cargo 执行 new 命令创建 Rust 工程时,工程目录下会建立一个 Cargo.toml 文件。工程的实质就是一个包,包必须由一个 Cargo.toml 文件来管理,该文件描述了包的基本信息以及依赖项。
一个包最多包含一个库”箱”,可以包含任意数量的二进制”箱”,但是至少包含一个”箱”(不管是库还是二进制”箱”)。
当使用 cargo new 命令创建完包之后,src 目录下会生成一个 main.rs 源文件,Cargo 默认这个文件为二进制箱的根,编译之后的二进制箱将与包名相同。模块(Module)
模块就是命名空间,用关键字 mod 表示
对于一个软件工程来说,我们往往按照所使用的编程语言的组织规范来进行组织,组织模块的主要结构往往是树。Java 组织功能模块的主要单位是类,而 JavaScript 组织模块的主要方式是 function。
这些先进的语言的组织单位可以层层包含,就像文件系统的目录结构一样。Rust 中的组织单位是模块(Module)。
这是一段描述法治国家的程序:国家(nation)包括政府(government)、议会(congress)和法院(court),分别有行政、立法和司法的功能。我们可以把它转换成树状结构:mod nation {
mod government {
fn govern() {}
}
mod congress {
fn legislate() {}
}
mod court {
fn judicial() {}
}
}
在文件系统中,目录结构往往以斜杠在路径字符串中表示对象的位置,Rust 中的路径分隔符是 :: 。nation
├── government
│ └── govern
├── congress
│ └── legislate
└── court
└── judicial
路径分为绝对路径和相对路径。绝对路径从 crate 关键字开始描述。相对路径从 self 或 super 关键字或一个标识符开始描述。例如:
是描述 govern 函数的绝对路径,相对路径可以表示为:crate::nation::government::govern();
现在你可以尝试在一个源程序里定义类似的模块结构并在主函数中使用路径。nation::government::govern();
如果你这样做,你一定会发现它不正确的地方:government 模块和其中的函数都是私有(private)的,你不被允许访问它们。use 关键字
use 关键字能够将模块标识符引入当前作用域: ```rust mod nation { pub mod government {
} }pub fn govern() {}
use crate::nation::government::govern;
fn main() { govern(); } ```