结论
两种方式:1)include宏,即 include!("file_path");2)mod 方式。
使用场景或者使用最佳实践如下,
一、大部分时候是用 mod 方式。每个文件夹下有一个 mod.rs 文件来控制 struct/func/等 的导出,用来给内部、外部模块使用。
二、include宏等价于复制粘贴,和C/C++的include一样,在宏展开阶段会将整个文件 copy 过来。include宏也有两种场景:1)例如结构体方法的实现,是在多个文件中实现的。另外有时候该多个结构体方法的实现文件组织在一个或几个文件夹中,但却不想将该文件夹声明为模块(mod.rs)。2)文件或者文件夹名字中有中文,使用 mod.rs 方式会报错,此时要么改名为无中文,要么使用include宏。
详细
以力扣刷题场景为例(我学习新语言经常喜欢用力扣刷题来熟悉),我的习惯如下(Java项目为例),
如图,在src/main/java下,有汇总目录,例如1-100题、101-200题等。每个汇总目录下,有单个题目的目录,用来存放某道题的题目描述和解法,有些题目有多个解法,就会有多个Solution类,如图中Solution和Solution2。这样安排的目的是:1)方便快速检索;2)方便单个题目的组织管理。
这次用rust也希望按照这种管理方式。但是rust的mod管理方式不是基于文件系统的,也就是说rust文件有两个视角,一个是文件系统视角,另一个是rust编译器视角(即mod视角)。
mod具体可参阅rust官方的文档了解,此处不赘述。
mod 方式
该方式下文也会称 mod.rs,两个表述等价。
这种方式下,每个子文件夹下都需要一个 mod.rs 文件,如下图,
可以看到,每个文件夹下面有一个mod.rs文件,在mod.rs文件中控制该文件夹下什么东西导出。另外可以看出一些规律,
- p001_100文件夹下的mod.rs,mod文件中 pub mod 后面是其子文件夹的名字。
- p001两数之和、p002两数相加文件夹下的mod.rs,mod文件中 pub mod 后面是其子文件的名字。
以p002两数相加文件夹为例,可以看下如何导入导出,
include宏方式
该方式下文也会简称include方式。
include上面也提到了有两种方式。
第一种方式。像上面举例的mod方式,文件夹名字是有中文的, rust是会报错的,例如,error[E0754]: trying to load file for module `p001两数之和` with non-ascii identifier name
。
那么此时可以用include方式,见上图,第一个框的注释掉并且打开include宏的注释即可正常运行。
第二种方式。结构体方法的实现文件组织在多个文件中,或者组织在一个/多个文件夹中,但却不想将该文件夹声明为模块(文件夹声明为模块需要添加mod.rs文件,文件夹多了之后会显得乱),此时就可以使用include。