基本概念
在 Rust 中,模块(Module)是一种组织代码的机制,用于将相关的功能组织在一起,提供代码的可重用性、可维护性和可理解性。
模块允许你将相关的函数、结构体、枚举、常量和其他项组织在一起,形成一个逻辑上独立的单元。通过使用模块,你可以将代码按功能和责任分割为不同的部分,使代码更加模块化和结构化。
Rust 的模块由mod关键字和模块名以及{}
组成。
eg:
rust
mod my_module {
// 模块的内容在这里定义
fn private_function() {
// 私有函数
}
pub fn public_function() {
// 公共函数
}
pub struct MyStruct {
// 公共结构体
}
enum MyEnum {
// 枚举
}
}
模块内部的项默认情况下是私有的,只能在模块的内部进行访问,如果想要在模块外面访问模块内部的项,则需要使用pub
关键字进行修饰。 当使用cargo new project 创建一个项目时,默认生成的文件夹目录如下:
其中main.rs为入口文件。
访问模块以及模块内部的项
rust 中的模块默认时private的,当只有使用pub关键字时,才可以在当前模块或者外部模块被访问到。
1 当前模块
rust
// #[warn(non_snake_case)]
mod test_mod {
pub fn clg(){
print!("assssssssssss\n")
}
}
fn main() {
test_mod::clg();
println!("Hello, world!");
}
2 外部模块, 外部模块和引入模块处于同一级目录 只使用mod关键字
当我们的模块处于外部时, 模块内部使用mod或者use关键字来引用外部模块。同时我们的外部模块需要定义模块和内部的方法同时为pub
,这样外部的模块才能够访问的到。
garden.rs
rust
pub mod garden_mod {
pub fn garden_test(){
println!("from garden.rs")
}
}
main.rs
定义:
rust
mod garden;
// use crate::garden;
fn main() {
// test_mod::clg();
garden::garden_mod::garden_test();
println!("Hello, world!");
}
3 搭配使用use
和mod
关键字从外部导入模块。
use 关键字的另一个作用时可以使我们引用的路径变短 ,同时在后面加上as还能够起到另起别名的作用。
- 同一级目录下:
garden.rs
rust
pub mod garden_mod {
pub fn garden_test(){
println!("from garden.rs")
}
}
main.rs
rust
mod garden; // 定义模块
use crate::garden::garden_mod; // 找到模块名
fn main() {
// test_mod::clg();
garden_mod::garden_test();
println!("Hello, world!");
}
- 非同一级目录下:主文件访问子模块
文件夹下需要定义mod.rs
,并导出当前文件夹下需要导出的子模块。
这样才能够访问到子模块。
taue.rs
rust
pub mod taue_mod {
pub fn taue_test(){
println!("from taue.rs")
}
}
main.rs
rust
mod taue;
use crate::taue::taue::taue_mod::taue_test;
fn main() {
// test_mod::clg();
// garden_mod::garden_test();
taue_test();
println!("Hello, world!");
}
4. 不同模块之间的访问
当我们想实现不同模块之间的访问的时候,原理类似,首先子模块定义要导出的模块,
curry 文件夹下 ablet.rs
rust
pub mod curry_mod {
pub fn curry_test(){
crate::taue::taue::taue_mod::taue_test();
println!("from curry.rs")
}
}
定义mod.rs 文件并导出
rust
pub mod ablet;
使用时:
rust
pub fn curry_test(){
crate::taue::taue::taue_mod::taue_test();
println!("from curry.rs")
}
main.rs
文件使用时:
rust
mod curry;
mod taue; // 注意: 当其他模块之前有互相调用时,主模块需要定义互相调用的模块。
use crate::curry::ablet::curry_mod::curry_test;
fn main() {
// test_mod::clg();
// garden_mod::garden_test();
// taue_test();
curry_test();
println!("Hello, world!");
}
同一个文件夹下的多个不同模块之间访问 ,除了可以使用crate:: 路径
之外还可以使用super关键字来引用同一个文件夹下的不同模块之间的mod。
首先在mod.rs下定义, 多个模块
curry.rs
rust
pub mod stephen {
pub fn test_other_mods(){
println!("from other module")
}
}
同一级目录下的ablet.rs
rust
pub mod curry_mod {
pub fn curry_test(){
// taue_mod::taue_test();
// crate::taue::taue::taue_mod::taue_test();
super::super::curry::stephen::test_other_mods();
println!("from curry.rs")
}
}
之后 main.rs 使用之前互相调用的curry_test
方法:
rust
mod curry;
use crate::curry::ablet::curry_mod::curry_test;
fn main() {
// test_mod::clg();
// garden_mod::garden_test();
curry_test();
println!("Hello, world!");
}
总结
rust 的模块定义和使用方式还有诸如self,和外部模块External等,本文主要介绍了几种不同的场景下,rust模块的互相的调用方式。如有问题,欢迎指正。