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