一、前言
前面我们已经使用了很多别人写的包,而本文就将详细介绍我们如何去写一个属于自己的包。
包的作用相信大家已经有所领悟:可以共享常用代码,避免大家造轮子。
在rust中,包的别名是crate
,而crate
则是rust编译的最小代码单位,比如我们前面写的main.rs
中的代码,最终会被编译为一个二进制可执行文件。
main.rs
文件中的代码此时就属于我们自定义项目的一个源代码文件。
类比之下,其实它这里这个包的概念与vs中解决方案的概念很类似,而crate
就像是vs中的各个项目。
没错,二进制项目在rust中同样也被称为crate
,除了二进制外,当然也还有更常见的库,比如动态库与静态库。
总的来说,rust中将项目一共分为了四个层次:工作空间、crate、模块、源码文件
graph LR
P[工作空间]-->A[多个crate]
A-->B[二进制]
A-->C[库]
B-->f1([多个模块])
C-->f1([多个模块])
f1-->f2([源代码文件1])
f1-->f3([源代码文件2])
f1-->f4([......])
一个工作空间可以包含多个crate
,而crate
可以被分为二进制和库两种。
每个crate
都是由多个模块组成的,并且一个模块可以由多个源文件组成。
但一般我们并不这样做,更多的时候,至少我个人更喜欢让一个源文件对应一个模块,方便整理,而文件名就是模块名。
二、模块
我们从底层往上层看,首先是模块,虽然前面我说大多数时候我都更喜欢一个文件对应一个模块,但你也可以不这样做:
比如上面这样,就属于内联方式,直接用mod
关键字声明一个模块,然后将函数、结构体等写在其内部就行了。
但此时要注意,模块中的东西默认都是私有的,如果想要让模块外使用,就必须添加pub
关键字。
使用方式就是模块名::
,后面紧跟其内部写的东西就行了。