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

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

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

我们还将讨论封装实现细节,这让你可以在更高的层次上重用代码:一旦你实现了一个操作,其他代码就可以通过它的公共接口调用你的代码,而不必知道实现是如何工作的。你编写代码的方式定义了哪些部分是公共的,可供其他代码使用,哪些部分是私有的,你保留更改的权利。这是限制你必须记住的细节数量的另一种方法。

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

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

  • 包:Cargo 的一项功能,可让你构建、测试和共享包
  • 依赖箱:生成库或可执行文件的模块树
  • 模块和使用:让你控制路径的组织、范围和隐私
  • 路径:一种命名项目的方式,例如结构、函数或模块

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