使用包、箱和模块管理不断增长的项目

当你编写大型程序时,组织代码将变得越来越重要。通过将相关功能分组并将具有不同功能的代码分离,你可以清楚地了解在哪里可以找到实现特定功能的代码,以及在哪里可以更改功能的工作方式。

到目前为止,我们编写的程序都位于一个文件中的一个模块中。随着项目的增长,你应该通过将其拆分为多个模块,然后拆分为多个文件来组织代码。一个包可以包含多个二进制箱,并且可以选择包含一个库箱。随着包的增长,你可以将部分提取到单独的箱中,这些箱成为外部依赖项。本章涵盖所有这些技术。对于包含一组相互关联的包的非常大的项目,这些包一起发展,Cargo 提供了工作区,我们将在第 14 章的“Cargo 工作区”部分中介绍。

我们还将讨论封装实现细节,这使你能够在更高层次上重用代码:一旦你实现了某个操作,其他代码就可以通过其公共接口调用你的代码,而无需了解实现方式。你编写代码的方式定义了哪些部分对其他代码公开,哪些部分是私有实现细节,你有权更改这些细节。这是另一种限制你必须记住的细节数量的方法。

一个相关的概念是作用域:编写代码的嵌套上下文具有一组定义为“在作用域内”的名称。在阅读、编写和编译代码时,程序员和编译器需要知道特定位置的特定名称是指变量、函数、结构体、枚举、模块、常量还是其他项目,以及该项目的含义。你可以创建作用域并更改哪些名称在作用域内或不在作用域内。你不能在同一个作用域中拥有两个具有相同名称的项目;可以使用工具来解决名称冲突。

Rust 具有许多功能,使你能够管理代码的组织方式,包括哪些细节是公开的,哪些细节是私有的,以及程序中每个作用域中有哪些名称。这些功能有时统称为模块系统,包括

  • 包:Cargo 的一项功能,使你能够构建、测试和共享箱
  • 箱:生成库或可执行文件的模块树
  • 模块use:使你能够控制路径的组织、作用域和隐私
  • 路径:命名项目(如结构体、函数或模块)的方式

在本章中,我们将介绍所有这些功能,讨论它们如何交互,并解释如何使用它们来管理作用域。到最后,你应该对模块系统有深入的了解,并能够像专业人士一样使用作用域!