Rust 学习笔记(卷二)
文章目录
- Rust 学习笔记(卷二)
- 八、工程
- 1. package 和 crate
- package 总览
- 包根(crate root)
- 2. 模块
- 初识模块
- 单个源文件中的嵌套模块
- 使用具有层级结构的源文件构造嵌套模块
- 3. 文档
- 4. 使用第三方包
- 5. 打包自己的包
- 九、标准库
- 十、多线程的并发编程
- 十一、“不安全”编程
- unsafe 代码块
- 全局变量与静态变量
- 内部可变性
Rust 学习笔记(卷二)
八、工程
相比以前的 C++,Rust 提出了包和模块的概念,使工程管理变得更加有组织。下面我们会自顶向下的介绍 Rust 中有关工程的概念。
1. package 和 crate
package 总览
Rust 工程管理中,最大的概念是 package,其次是 crate。Rust 的 crate 可以是一个库,也可以是一个可执行文件,而 package 的作用则是将一个或多个 crate 组织起来。
Package 是使用 Cargo.toml
文件管理的,这是我们所熟悉的,而 crate 则有组织地被放在项目文件夹中,包括:
- 库包。需要存在
src/lib.rs
源文件。包名与项目名相同。一个项目只能有一个库包。 - 可执行文件包。需要存在
src/main.rs
源文件。包名与项目名相同。 - 更多可执行文件包。每个
src/bin/
中的源文件都是一个包,包名与文件名相同。
对比 C++ 来看,package 可以看作 CMake 的 project,而 crate 可以看作 CMake 的 target。
包根(crate root)
前面提到,如果一个 package 包含唯一的库包0,则需要存在 src/lib.rs
文件;对于可执行文件包则需要存在 src/main.rs
。像这种一个源文件代表一个 crate 的,我们称为包根(crate root)。
包根只是一个源文件,那多个源文件该怎么办?方法是借助模块。模块的机制允许我们将包内的代码放在多个源文件中。
2. 模块
初识模块
Rust 中,与模块相关的关键字是 mod
。
// src/orange.rs
pub fn hello() {println!("Hello, orange!");
}
// src/main.rs
mod orange;
use orange::hello;
fn main() {hello();
}
// orange.cpp
export module orange; // 手动写明,与文件名本身无关。
import std;
namespace orange { // 手动创建命名空间,与模块无关。export void hello() {std::cout << "Hello, orange!" << std::endl;}
}
// 源.cpp
import orange;
using orange::hello;
int main() {hello();
}
关于 Rust 程序 79 的新东西有:
pub
关键字。如果要使用的东西不属于自己的父模块(例如程序 79 中,orange
模块和main
模块是兄弟,orange
模块不是main
模块的父模块),则只能使用公开的模块,用pub
关键字表示。这和 C++ 程序 79 中hello
函数前的export
关键字一样。mod
关键字。其功能是在包根所在目录查找指定名字的源文件,并将源文件中的内容视为位于同名模块中(例如程序 79 中,在包根main.rs
同目录下找到了orange.rs
,将orange.rs
中的内容视为位于模块orange
中)。use
关键字。一旦模块进入视野内(例如程序 79 中通过mod
语句在当前位置声明了一个模块,又如通过配置依赖项已经引入了外部模块),则可以使用use
语句引入模块里的内容。使用use
语句引入内容的可见性将在之后讲解。
与 C++ 要求必须在单独的文件里定义模块不同,Rust 中允许在同一个源文件里定义模块。所以 Rust 的模块更像是 C++ 的模块和命名空间的结合体。
mod orange {pub fn hello() {println!("Hello, orange!");}
}
use orange::hello;
fn main() {hello();
}
import std;
namespace orange { // 只有命名空间,没有模块。void hello() {std::cout << "Hello, orange!" << std::endl;}
}
using orange::hello;
int main() {hello();
}
Rust 程序 80 中,mod
块前没有再加 pub
,这是因为我们在下面使用它时已经能够看到它的完整实现了,所以没有必要再加上 pub
。
单个源文件中的嵌套模块
使用具有层级结构的源文件构造嵌套模块
3. 文档
4. 使用第三方包
5. 打包自己的包
九、标准库
十、多线程的并发编程
并发、异步。
十一、“不安全”编程
unsafe 代码块
全局变量与静态变量
理论上,全局变量越少越好,以防形成一盘散沙之势。然而,全局变量通常也是无法避免的,例如在使用单例设计模式时。