Skip to main content

使用包、板条箱和模块管理日益增长的项目

随着编写的大型程序,组织代码将变得越来越重要。通过将相关功能分组并将具有不同特性的代码分开,您将明确知道在哪里找到实现特定功能的代码以及在哪里去更改功能的工作方式。

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

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

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

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

  • 包(Packages):Cargo 功能,用于构建、测试和共享箱
  • 板条箱(Crates):一棵模块树,产生一个库或可执行文件
  • 模块(Modules)use:让您控制路径的组织、作用域和私有性
  • 路径(Paths):一种命名项的方式,例如结构体、函数或模块

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