使用 Packages、Crate 和 Modules 管理不断增长的项目
当您编写大型程序时,组织代码将变得越来越重要。通过对相关功能进行分组并分隔具有不同功能的代码,您将阐明在何处查找实现特定功能的代码,以及在何处更改功能的工作方式。
到目前为止,我们编写的程序都位于一个文件中的一个模块中。随着项目的增长,您应该通过将代码拆分为多个模块,然后拆分为多个文件来组织代码。一个包可以包含多个二进制 crate 和一个可选的库 crate。随着软件包的增长,您可以将部件提取到单独的 crate 中,这些 crate 将成为外部依赖项。本章介绍了所有这些技术。对于由一组共同发展的相互关联的包组成的非常大的项目,Cargo 提供了工作区,我们将在第 14 章的 “Cargo 工作区” 一节中介绍。
我们还将讨论封装实现细节,这允许您在更高级别重用代码:一旦您实现了一个作,其他代码就可以通过其公共接口调用您的代码,而无需知道实现的工作原理。您编写代码的方式定义了哪些部分是公共的,供其他代码使用,哪些部分是您保留更改权利的私有实现详细信息。这是另一种限制您必须保留在脑海中的细节量的方法。
一个相关的概念是 scope:编写代码的嵌套上下文具有一组定义为 “in scope” 的名称。在读取、编写和编译代码时,程序员和编译器需要知道特定位置的特定名称是否引用变量、函数、结构、枚举、模块、常量或其他项,以及该项的含义。您可以创建范围并更改哪些名称在范围内或范围外。不能在同一范围内有两个同名的项目;工具可用于解决名称冲突。
Rust 具有许多功能,允许您管理代码的组织,包括公开哪些详细信息、哪些详细信息是私有的以及程序中每个作用域中的名称。这些功能有时统称为模块系统,包括:
包:一个 Cargo 功能,可让您构建、测试和共享 crate
箱子:生成库或可执行文件的模块树
模块和用途:用于控制路径的组织、范围和隐私
路径:一种命名项的方法,例如结构、函数或模块
在本章中,我们将介绍所有这些功能,讨论它们如何交互,并解释如何使用它们来管理范围。到最后,您应该对模块系统有深入的了解,并且能够像专业人士一样使用示波器!