Rust模块和Crate

基本概念

在 Rust 中,模块(Module)是一种组织代码的机制,用于将相关的功能组织在一起,提供代码的可重用性、可维护性和可理解性。

模块允许你将相关的函数、结构体、枚举、常量和其他项组织在一起,形成一个逻辑上独立的单元。通过使用模块,你可以将代码按功能和责任分割为不同的部分,使代码更加模块化和结构化。

Rust 的模块由mod关键字和模块名以及{}组成。

eg:

mod my_module {
    // 模块的内容在这里定义

    fn private_function() {
        // 私有函数
    }

    pub fn public_function() {
        // 公共函数
    }

    pub struct MyStruct {
        // 公共结构体
    }

    enum MyEnum {
        // 枚举
    }
}

模块内部的项默认情况下是私有的,只能在模块的内部进行访问,如果想要在模块外面访问模块内部的项,则需要使用pub关键字进行修饰。
当使用cargo new project 创建一个项目时,默认生成的文件夹目录如下:

Rust模块和Crate
其中main.rs为入口文件。

访问模块以及模块内部的项

rust 中的模块默认时private的,当只有使用pub关键字时,才可以在当前模块或者外部模块被访问到。

1 当前模块

// #[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

pub mod garden_mod {
    pub fn garden_test(){
        println!("from garden.rs")   
    }
}

main.rs定义:

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

pub mod garden_mod {
    pub fn garden_test(){
        println!("from garden.rs")   
    }
}

main.rs

mod garden; // 定义模块
use crate::garden::garden_mod; // 找到模块名

fn main() {
    // test_mod::clg();
    garden_mod::garden_test();
    println!("Hello, world!");
}
  1. 非同一级目录下:主文件访问子模块

文件夹下需要定义mod.rs,并导出当前文件夹下需要导出的子模块。

Rust模块和Crate
这样才能够访问到子模块。

taue.rs

pub mod taue_mod {
    pub fn taue_test(){
        println!("from taue.rs")   
    }
}

main.rs

mod taue;
use crate::taue::taue::taue_mod::taue_test;

fn main() {
    // test_mod::clg();
    // garden_mod::garden_test();
    taue_test();
    println!("Hello, world!");
}

Rust模块和Crate
4. 不同模块之间的访问

当我们想实现不同模块之间的访问的时候,原理类似,首先子模块定义要导出的模块,

curry 文件夹下 ablet.rs

pub mod curry_mod {
    pub fn curry_test(){
        crate::taue::taue::taue_mod::taue_test();
        println!("from curry.rs")   
    }
}

定义mod.rs 文件并导出

pub mod ablet;

使用时:

    pub fn curry_test(){
        crate::taue::taue::taue_mod::taue_test();
        println!("from curry.rs")   
    }

main.rs 文件使用时:

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!");
}

Rust模块和Crate

同一个文件夹下的多个不同模块之间访问,除了可以使用crate:: 路径之外还可以使用super关键字来引用同一个文件夹下的不同模块之间的mod。

首先在mod.rs下定义, 多个模块

Rust模块和Crate

curry.rs

pub mod stephen {
    pub fn test_other_mods(){
        println!("from other module")
    }
}

同一级目录下的ablet.rs

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方法:

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模块和Crate

总结

rust 的模块定义和使用方式还有诸如self,和外部模块External等,本文主要介绍了几种不同的场景下,rust模块的互相的调用方式。如有问题,欢迎指正。

原文链接:https://juejin.cn/post/7344567634916933666 作者:前端库里

(0)
上一篇 2024年3月11日 上午10:15
下一篇 2024年3月11日 上午10:26

相关推荐

发表回复

登录后才能评论