Rust模块和Crate

基本概念

在 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 搭配使用usemod关键字从外部导入模块。

use 关键字的另一个作用时可以使我们引用的路径变短 ,同时在后面加上as还能够起到另起别名的作用

  1. 同一级目录下:

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!");
}
  1. 非同一级目录下:主文件访问子模块

文件夹下需要定义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模块的互相的调用方式。如有问题,欢迎指正。

相关推荐
雯0609~6 分钟前
网页F12:缓存的使用(设值、取值、删除)
前端·缓存
℘团子এ9 分钟前
vue3中如何上传文件到腾讯云的桶(cosbrowser)
前端·javascript·腾讯云
学习前端的小z15 分钟前
【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
开发语言·前端·javascript
彭世瑜39 分钟前
ts: TypeScript跳过检查/忽略类型检查
前端·javascript·typescript
FØund40439 分钟前
antd form.setFieldsValue问题总结
前端·react.js·typescript·html
Backstroke fish40 分钟前
Token刷新机制
前端·javascript·vue.js·typescript·vue
小五Five41 分钟前
TypeScript项目中Axios的封装
开发语言·前端·javascript
小曲程序41 分钟前
vue3 封装request请求
java·前端·typescript·vue
临枫54142 分钟前
Nuxt3封装网络请求 useFetch & $fetch
前端·javascript·vue.js·typescript
前端每日三省43 分钟前
面试题-TS(八):什么是装饰器(decorators)?如何在 TypeScript 中使用它们?
开发语言·前端·javascript