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模块的互相的调用方式。如有问题,欢迎指正。

相关推荐
黑客老陈1 小时前
新手小白如何挖掘cnvd通用漏洞之存储xss漏洞(利用xss钓鱼)
运维·服务器·前端·网络·安全·web3·xss
正小安1 小时前
Vite系列课程 | 11. Vite 配置文件中 CSS 配置(Modules 模块化篇)
前端·vite
暴富的Tdy1 小时前
【CryptoJS库AES加密】
前端·javascript·vue.js
neeef_se1 小时前
Vue中使用a标签下载静态资源文件(比如excel、pdf等),纯前端操作
前端·vue.js·excel
m0_748235611 小时前
web 渗透学习指南——初学者防入狱篇
前端
z千鑫2 小时前
【前端】入门指南:Vue中使用Node.js进行数据库CRUD操作的详细步骤
前端·vue.js·node.js
m0_748250743 小时前
Web入门常用标签、属性、属性值
前端
m0_748230443 小时前
SSE(Server-Sent Events)返回n ,前端接收数据时被错误的截断【如何避免SSE消息中的换行符或回车符被解释为事件消息的结束】
前端