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

相关推荐
子兮曰17 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰17 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万18 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝18 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋18 小时前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
不是株19 小时前
零到全栈(网页从哪来,服务器怎么架)
全栈
卡布鲁19 小时前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王952721 小时前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大21 小时前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师21 小时前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端