什么是模块
模块是用来分割与组织代码的一种方式。 在开发中,代码往往会变得越来越复杂,模块可以帮助我们更好地组织代码,提高代码的可读性和可维护性。 代码超过一屏幕时,就应该考虑将其拆分 为模块。
在Rust中,组织代码的基本单元是模块。
模块是Rust中的一个重要概念,它可以帮助我们更好地组织代码,提高代码的可读性和可维护性。
在Rust中,模块中可以包含函数、结构体、枚举、trait等等,甚至模块中也可以包含其他模块。
首先我们来看,如何创建模块。
在Rust中哪些方式可以创建模块
- 使用
mod
关键字,mod
关键字后面跟着模块名 - 单个文件,文件名即为模块名
- 包含
mod.rs
文件的目录,包含mod.rs
文件的目录即为一个模块,目录名即为模块名
使用mod
关键字
mod my_module {
pub fn my_function() {
println!("Hello, world!");
}
}
单个文件
// src/my_module.rs
pub fn my_function() {
println!("Hello, world!");
}
包含mod.rs
文件的目录
// src/my_module/mod.rs
pub fn my_function() {
println!("Hello, world!");
}
以上三种方式都可以创建一个名为my_module
的模块,其中包含一个名为my_function
的函数。
那么创建好模块之后如何使用模块呢?
如何使用模块
创建好模块之后,就是怎么来使用模块,便于我们调用模块中的函数,或者使用模块中的结构体、枚举等。
首先就是需要声明模块,然后就可以使用模块中的函数了。
声明模块的方法是在文件中使用mod
关键字,后面跟着模块名,跟着分号;
声明模块
mod my_module;
导入模块中的中的内容
可以导入模块中的函数、结构体、枚举等,使用use
关键字,后面跟着模块名,再跟着::
,再跟着要导入的内容。
如要要导入模块中的函数、结构体、枚举等,需要在模块中使用pub
关键字,表示对外公开。
否则,模块中的内容默认是私有的,无法在其他模块中使用。
如果需要层层导出的话,可以使用pub use
关键字,可以让这个模块引入的内容再被其他模块引入。
use my_module::my_function;
// 或者
// pub use my_module::my_function;
my_function();
引入模块有两种方式:
- 绝对路径导入
- 对于当前项目中:使用绝对路径导入,需要从crate根开始,以
crate
关键字开头- 对于第三方库:使用绝对路径导入,
crate_name
后跟::
,再跟着模块名或者需要导入的内容
- 对于第三方库:使用绝对路径导入,
- 相对路径导入
- 使用
super
关键字表示父模块,使用父模块下的内容,一般使用场景是在子模块中使用父模块的内容,比如写测试用例时 - 使用
self
关键字表示当前模块,使用当前模块下的内容,可以省略self
,一般使用场景是如果有同名的模块和函数时,可以使用self
来区分
- 使用
总结
在Rust中,使用模块大体分为两步:
- 创建模块,有三种方式可以创建模块,即:
mod my_module { ... }
- 单个文件(
src/my_module.rs
) - 包含
mod.rs
文件的目录(src/my_module/mod.rs
)
- 单个文件(
- 使用模块
- 声明模块:
mod my_module;
,使用模块之前需要先声明模块- 导入模块 中的内容:
use my_module::my_function;
,使用use
关键字导入模块中的内容,使用pub use
关键字可以让这个模块引入的内容再被其他模块引入
- 导入模块 中的内容:
-
引入模块有两种方式:
- 绝对路径导入:使用
crate
关键字(针对于当前项目的crate)或者crate_name
模块名(针对当前crate之外的crate,即依赖的crate) - 相对路径导入:使用
super
关键字(一般用来写测试模块使用较多)或者self
关键字(一般用来区分同名模块和函数)
- 绝对路径导入:使用
-
Rust中的
mod.rs
和Python中的__init__.py
类似, 都是用来标识目录为一个模块的文件,mod.rs
文件中可以包含模块的内容,也可以导入其他模块。 也可以使用pub use
关键字逐层导出,方便使用,将所有需要用到的内容逐层导出到lib.rs
,别的模块使用时不必写很长的路径,也更容易找。