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.rs
、src/lib.rs
或 src/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
将路径引入本地,跟 python
的 import
类似.可以使用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.rs
或main.rs
或bin/*.rs
中, 可以声明模块 mod A
,那么从crate
根路径开始的A.rs
文件即为该模块的地址.对子模块,比如在 A.rs
中声明了 mod B
,那么 A\B.rs
即为该模块的地址.
另有一种旧的声明模式 ,可以使用 A\mod.rs
和 A\B\mod.rs
来定位模块文件位置.
- 打赏
- 分享
- 微信
- 支付宝