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

当我们编写大型程序时,组织代码就显得非常重要,因为我们想直接在脑海中构建整个程序,几乎不可能完成的。

随着项目的增长:我们可以把代码分解成多个模块和多个文件来组织

一个包可以包含多个二进制crate和一个可选的crate库,伴随的着包的增长,我们可以将部分代码提取出来,做成独立的crate,这些crate作为外部依赖项

对一个由一系列相互关联的包组合而成的超大大型项目,Cargo提供了“工作空间”这一功能,我们将会在第十四章中cargo workspaces 对此进行讲解

除了对功能进行分组之外,封装实现细节可以让我们更加高级的重用代码:当我们实现了一个操作后,其它代码可以通过该代码的公共接口来进行调用,而不用关心它的实现细节。我们在编写代码时就可以定义哪些部分是其它代码可以使用的公共部分,以及哪些部分是我们有权更改的私有部分

Rust管理代码的“模块系统”包括:

包:cargo的一个功能,它允许我们构建】、测试和分享crate

Crates:一个模块的树形结构,它形成了库或者二进制项目

模块use:允许我们控制作用域和路径的私有性

路径:一个命名例如结构体、函数或模块等项的方式

7.1 包和crate

模块系统的第一部分:我们介绍包和crate,crate是一个二进制项或者库。crate root是一个源文件,rust编译器以它为起始点,并构成你的crate的根模块。

包是提共一系列功能的的一个或者多个crate.

一个包会包含有一个cargo.tmol,阐述如何取构建这些crate

包中所包含的内容由几条规则来确定:一个包之多之只能包含一个库crate(library crate);包中可以包含任意多个二进制crate(binary crate),包中至少包含一个crate,无论是库还是二进制的

让我们来看看创建包的时候会发生什么?

$ cargo new my-projectCreated binary (application) `my-project` package
$ ls my-project
Cargo.toml
src
$ ls my-project/src
main.rs

当我们使用cargo 创建包时,cargo会帮助我们创建一个Cargo.toml文件,我们查看Cargo.toml内容,发现其并没有提及src/main.rs.

因为Cargo遵循一个约定,srs/main.rs是一个与包同名的二进制crate的crate根

同样的,Cargo知道如果包目录中包含src/lib.rs,则包带有与其同名的库crate,且src/lib.rs是crate根。crate根文件将由cargo传递给rustc来实际构建库或二进制项目

在此,我们有了一个只包含srs/main.rs的包,意味着它只含有一个名为“my-project”的二进制crate。如果一个包只包含src/main.rs和src/lib.rs,则它有两个crate:一个库和一个二进制项目,且名字都与包相同,通过将文件放在srs/bin目录下,一个包可以拥有多个二进制crate:每个src/bin下的文件都会被编译成一个二进制crate

一个crate会将一个作用域内的想关功能组分到一起,从而使得该功能可以很方便的在多个项目之间共享。例如:在第二章,我们使用了rand crate提供了生成随机数功能,通过将rand crate加入到我们项目的作用域中,我们就可以在自己的项目中使用它,rand crate提供的所有功能都可通过该crate的名字:rand进行访问

将一个crate的功能保持在其自身的作用域中,可以知道一些特定的功能是在我们的crate定义的还是在rand crate中定义的,这样就可以防止潜在的冲突,例如:rand crate提供了一个名为Rng的特性(trait).我们还可以在我们自己的crate中定义一个名为Rng的 struct。因为一个crate的功能是在自身的作用域内命名的,当我们将rand作为一个依赖编译器不会混淆Rng这个名字的指向,在我们的crate中,它指向的是我们自己定义的struct Rng,我们可以通过rand::Rng这一方式来访问randx crate中的Rng特性(trait)

下一节,我们来聊一聊系统

The Rust Programming Language - 第7章 使用包、crate和模块管理不断增长的项目 - 7.1 包和crate相关推荐

  1. The Rust Programming Language - 第19章 高级特征 - 19.5 宏

    19 高级特征 我们将在这一章学习更多高级功能 19.5 宏 宏指的是Rust中一系列功能,宏用macro_rules!来声明 三种过程宏: 1.自定义#[derive]宏在结构体和枚举上指定通过de ...

  2. The Rust Programming Language - 第11章 测试 - 11.1 编写测试

    11 测试 编写自动化测试 程序的正确性代码如我们期望的那样运行,Rust也在语言本身包含了编写软件测试的支持 本章我们会讲到编写测试时用到的注解和宏,运行测试的默认行为和选项,以及如何将测试组织成单 ...

  3. The Rust Programming Language - 第13章 Rust语言中的函数式语言功能:迭代器与闭包 - 13.1 可以捕获其环境的匿名函数

    13 Rust语言中的函数式语言功能:迭代器与闭包 函数式编程风格通常包括将函数作为另一个函数的参数.返回值,将函数作为值赋值给变量,以供后续执行 本章中我们将会介绍以下内容: 闭包:一个可以存储在变 ...

  4. The Rust Programming Language - 第18章 模式与模式匹配 - 18.2 Refutability(可反驳性):模式是否会匹配失效

    18 模式与模式匹配 模式是Rust中的特殊语法,用来匹配类型中的结构,无论类型复杂与否.模式由以下一些内容组合而成: 字面值\解构的数组.枚举.元组或者结构体\变量\通配符\占位符,这些部分描述了我 ...

  5. The Rust Programming Language - 前言

    前言 Rust程序设计语言本质在于赋能 Rust语言会涉及"系统层面"的工作,设计内存管理.数据表示和并发等底层细节(其实就是一些计算机系统.组成原理.数据结构.网络等方面的基础知 ...

  6. 《The C Programming Language》读书笔记 说明

    <The C Programming Language>读书笔记 说明 作为笔记而言,完全是一种自写自看的行为,本来是没有必要写这篇东西的.但是作为一个生活在网络时代的学 生来说,想学好一 ...

  7. 《The C Programming Language》答案(第一章)

    <The C Programming Language>答案(第一章) P1 #include <stdio.h> main() {printf("hello, wo ...

  8. 《The C Programming Language》(2nd Ed) Introduction 翻译

    <The C Programming Language>(2nd Ed) Introduction 翻译 说明: 1.       本人非专业翻译人员,信达雅三种境界,可以达到" ...

  9. [iOS翻译]《The Swift Programming Language》系列:Welcome to Swift-01

    本文转载至:http://www.cnblogs.com/yangfaxian/p/3765081.html 全书目录: 一.Welcome to Swift 二.Language Guide 三.L ...

  10. Ada 程序设计语言(The Ada Programming Language)[第二集]

    Ada 程序设计语言(The Ada Programming Language)[第二集]- -   2.5.2 通用离散类型属性 离散类型包括整型和枚举型,除了上述的属性外,还有: S'Pos   ...

最新文章

  1. 【效率】微软开源最强Python自动化神器!不用写一行代码!
  2. Codeforce 1182B Plus from Picture
  3. Careercup - Microsoft面试题 - 5428361417457664
  4. 2020年mysql中级课程一天一小时
  5. java socket 对方关闭_java Socket判断对方是否已关闭连接
  6. C语言 do while 和 while 循环 - C语言零基础入门教程
  7. 二元一次方程有唯一解的条件_人教版初中数学七年级下册用适当方法解二元一次方程组公开课优质课课件教案视频...
  8. 百度图神经网络学习——day02:图游走类模型
  9. 手机如何登录企业邮箱,公司电子邮箱登录页面
  10. Python图像变换及手绘效果
  11. 《STL源码分析》学习笔记 — STL概论与版本简介
  12. 数据全生命周期管理,华为FusionData一个方案搞定
  13. mysql冒号_mysql语句中的冒号是什么意思?
  14. 生活心语--幸福在哪里
  15. 大数据-HADOOP高可用、联邦机制- 学习笔记 -BH4
  16. IDT7206简明资料
  17. Git版本控制的使用
  18. MySQL中In与Exists的区别
  19. 从Excel 到微服务
  20. 14期《梅花香自苦寒来》12月刊

热门文章

  1. ODC:在线深度聚类的无监督表示学习
  2. 抖音短视频吃鸡戏精野生脆脆如何上的热门
  3. 关于H.264 profile-level-id
  4. 5. Longest Palindromic Substring
  5. 四大名著红楼梦第一回 甄士隐梦幻识通灵 贾雨村风尘怀闺秀
  6. MSP430F149用模拟SPI和FM25CL640通信
  7. 基于STC单片机串口扩展网络通信的应用
  8. 2021年4月4日腾讯笔试
  9. java里arcsin_java编程用泰勒级数计算arcsin
  10. 什么是程序?什么是程序设计?