07 使用包、Crate、模块来管理工程

rust 使用模块、包、Crate 来组织工程结构。目前为止我们所学的代码,都是在一个文件中,没有区分文件。rust 可以将代码按照模块进行组织。

当我们的工程变大时,可以将文件分割为包,包内包含不同模块和一个可选的 Crate;当包变大时,你可以将部分拆分到不同的 Crate,来作为外部依赖。

我们可以决定哪些代码可以公开,其他程序使用公开的外部接口来访问程序,而不需要了解细节。

7.1 包和 Crate

一个包可以包括至多一个库和任意多个 二进制Crate。一个包至少要包含一个 Crate

Crate 分为 库Crate和二进制Crate,即包含main函数的可执行Crate

使用 cargo 创建的包默认包括一个二进制Crate。默认情况下,使用src/main.rs作为二进制Crate的入口,使用src/lib.rs作为库Crate的入口。另外,在src/bin/ 目录下的 .rs文件,都作为二进制包。

7.2 定义模块来控制作用域和可见性

在入口代码中可以使用mod 关键字来定义模块。入口代码包括 src/main.rssrc/lib.rssrc/bin/xx.rs

在模块除了入口文件的顶层外,也可以在任意其他位置通过 mod xx 来定义子模块

模块和子模块都通过pub mod 来定义是否公开模块。

使用use来引入模块中的类型。路径一般是crate/module/submodule/type

7.3 模块引用路径

模块和模块中的成员有两种路径表示法: 绝对路径和相对路径。

绝对路径:从Crate的根目录开始,以 crate 开头,加上文件路径,以 :: 隔开形成的路径。

相对路径:从当前位置开始,类似于相对路径的路径,都是以:: 分隔

相对当前路径的上级路径,以super 表示

7.3.1 可访问性

当前模块中的成员之前,是可以相互访问的;子模块可以访问父模块的成员;父模块不能访问子模块的成员. 模块默认是私有的.
使用 pub mod 将模块定义为公有,意味着模块是公开的,但不代表可以随意访问模块中的内容.

函数默认是 private 的,要访问公有模块中的函数,需要在函数定义前增加pub,即pub fun.

结构默认是私有的,结构的成员默认也是私有的,使用pub struct 公开结构,但结构成员仍然是公有的,使用 pub 来定义结构成员为公有.

枚举默认是私有的,枚举的成员默认是公有的,定义pub enum即可将枚举定义为公有,枚举成员即可同样以公有方式访问.

7.4 使用use引入路径

可以使用use 将路径引入本地,跟 pythonimport 类似.可以使用as 定义别名.注意引入路径使用时,引入的是路径的最后一个空间,例如 引入 use A::B,使用B中成员时,要使用B::f ,而不能直接使用f.

引入路径可以使用 pub 关键字重新导出.

引入路径可以使用大括号组合

use A::{B, C};

use A::B::{self, C};

可以使用*引入所有公开成员,需要慎用.

7.5 将模块分割到不同的文件中

rust中,可以使用mod xx{} 嵌套使用模块,也可以将模块分割到不同的文件中.

crate入口中lib.rsmain.rsbin/*.rs 中, 可以声明模块 mod A,那么从crate根路径开始的A.rs文件即为该模块的地址.对子模块,比如在 A.rs 中声明了 mod B,那么 A\B.rs 即为该模块的地址.

另有一种旧的声明模式 ,可以使用 A\mod.rsA\B\mod.rs 来定位模块文件位置.

  • 打赏
  • 分享
分享到...
请选择打赏方式
  • 微信
  • 支付宝

By yhl

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注