Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

包、Crate 和模块

编写大型程序时,组织代码会变得越来越重要。通过组合相关功能并分离不同特性的代码,你可以清楚地知道在哪里找到实现某项功能的代码,以及应该到哪里修改该功能的行为。

到目前为止,我们编写的程序都放在一个文件的一个模块中。随着项目不断增长,你应该将代码拆分为多个模块,再分散到多个文件中。一个包可以包含多个二进制 crate,也可以选择包含一个库 crate。包逐渐变大时,你可以将其中一部分提取为独立 crate,作为外部依赖。本章将介绍这些技术。对于由一组相互关联、共同演进的包组成的大型项目,Cargo 提供了工作空间,我们将在第 14 章的“Cargo 工作空间”一节中介绍。

我们还将讨论如何封装实现细节,从而在更高层次上复用代码:实现某项操作后,其他代码可以通过公共接口调用它,而无须了解其实现方式。编写代码的方式决定了哪些部分公开给其他代码使用,哪些部分属于私有实现细节并可由你自行修改。这也有助于减少需要记在脑中的细节。

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

Rust 提供了许多功能来管理代码组织,包括哪些细节对外公开、哪些细节保持私有,以及程序中每个作用域包含哪些名称。这些功能有时统称为模块系统,包括:

  • 包(Packages):Cargo 提供的一项功能,用于构建、测试和共享 crate
  • Crate:由模块树组成,可生成库或可执行文件
  • 模块与 use:用于控制路径的组织方式、作用域和隐私性
  • 路径:为项目命名的方式,例如结构体、函数或模块

本章将介绍所有这些功能,讨论它们之间的相互作用,并说明如何使用它们管理作用域。读完本章后,你应该能够扎实地理解模块系统,并熟练使用作用域!