跳到主要内容

如何在Rust中更好地应用模块

鱼雪

什么是模块

模块是用来分割与组织代码的一种方式。 在开发中,代码往往会变得越来越复杂,模块可以帮助我们更好地组织代码,提高代码的可读性和可维护性。 代码超过一屏幕时,就应该考虑将其拆分为模块。

在Rust中,组织代码的基本单元是模块。

模块是Rust中的一个重要概念,它可以帮助我们更好地组织代码,提高代码的可读性和可维护性。

在Rust中,模块中可以包含函数、结构体、枚举、trait等等,甚至模块中也可以包含其他模块。

首先我们来看,如何创建模块。

在Rust中哪些方式可以创建模块

  1. 使用mod关键字,mod关键字后面跟着模块名
  2. 单个文件,文件名即为模块名
  3. 包含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();

引入模块有两种方式

  1. 绝对路径导入
  • 对于当前项目中:使用绝对路径导入,需要从crate根开始,以crate关键字开头
    • 对于第三方库:使用绝对路径导入,crate_name后跟::,再跟着模块名或者需要导入的内容
  1. 相对路径导入
    • 使用super关键字表示父模块,使用父模块下的内容,一般使用场景是在子模块中使用父模块的内容,比如写测试用例时
    • 使用self关键字表示当前模块,使用当前模块下的内容,可以省略self,一般使用场景是如果有同名的模块和函数时,可以使用self来区分

总结

在Rust中,使用模块大体分为两步:

  1. 创建模块,有三种方式可以创建模块,即:
  • mod my_module { ... }
    • 单个文件(src/my_module.rs)
    • 包含mod.rs文件的目录(src/my_module/mod.rs)
  1. 使用模块
  • 声明模块:mod my_module;,使用模块之前需要先声明模块
    • 导入模块中的内容:use my_module::my_function;,使用use关键字导入模块中的内容,使用pub use关键字可以让这个模块引入的内容再被其他模块引入
  1. 引入模块有两种方式:

    • 绝对路径导入:使用crate关键字(针对于当前项目的crate)或者crate_name模块名(针对当前crate之外的crate,即依赖的crate)
    • 相对路径导入:使用super关键字(一般用来写测试模块使用较多)或者self关键字(一般用来区分同名模块和函数)
  2. Rust中的mod.rs和Python中的__init__.py类似, 都是用来标识目录为一个模块的文件,mod.rs文件中可以包含模块的内容,也可以导入其他模块。 也可以使用pub use关键字逐层导出,方便使用,将所有需要用到的内容逐层导出到lib.rs,别的模块使用时不必写很长的路径,也更容易找。