关于rust的模块引入问题

 更新时间:2022年10月08日 11:33:55   作者:huangfengnt  
Rust 语言是一种高效、可靠的通用高级语言,它的执行效率也是令人称赞的,是一种少有的兼顾开发效率和执行效率的语言,这篇文章主要介绍了rust的模块引入相关知识,需要的朋友可以参考下

国庆第一次学习,真是太罪恶了,555

主要还是看这个官网学的,这一部分对应的是官网上那个教程的第七章,写的实在是让人有点费解,所以我这边自己写一下,当然范围限制在第七章,因为我暂时只是看到哪里

Rust 语言是一种高效、可靠的通用高级语言。其高效不仅限于开发效率,它的执行效率也是令人称赞的,是一种少有的兼顾开发效率和执行效率的语言。

Rust 语言由 Mozilla 开发,最早发布于 2014 年 9 月。Rust 的编译器是在 MIT License 和 Apache License 2.0 双重协议声明下的免费开源软件。截至目前( 2020 年 1 月)最新的编译器版本是 1.41.0。

Rust语言的特点

  • 高性能 - Rust 速度惊人且内存利用率极高。由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成。

  • 可靠性 - Rust 丰富的类型系统和所有权模型保证了内存安全和线程安全,让您在编译期就能够消除各种各样的错误。

  • 生产力 - Rust 拥有出色的文档、友好的编译器和清晰的错误提示信息, 还集成了一流的工具 —— 包管理器和构建工具, 智能地自动补全和类型检验的多编辑器支持, 以及自动格式化代码等等。

Rust的应用

Rust 语言可以用于开发:

  • 传统命令行程序 - Rust 编译器可以直接生成目标可执行程序,不需要任何解释程序。
  • Web 应用 - Rust 可以被编译成 WebAssembly,WebAssembly 是一种 JavaScript 的高效替代品。
  • 网络服务器 - Rust 用极低的资源消耗做到安全高效,且具备很强的大规模并发处理能力,十分适合开发普通或极端的服务器程序。
  • 嵌入式设备 - Rust 同时具有JavaScript 一般的高效开发语法和 C 语言的执行效率,支持底层平台的开发。

书上给了很多概念啊,比如什么crate,mod之类的,我这边实际一点,写一个叫school的包,这个包分成三个模块,分别是teacher、student、worker,最终我在main.rs当中要调用teacher包当中的一个函数,就这么简单,下面看一下我的结构

 很简单啊,src一个主要的main.rs,其他四个文件都在school文件夹下面。

worker.rs文件,简单看一下

pub mod male_worker {
    pub fn male_worker_num() -> i32 {
        8
    }
}

pub修饰符代表这个文件是外部可访问的,mod实际上是创建了一个命名空间,里面随便写了个函数,返回了8,这个数字。这里需要注意一下worker.rs本身就相当于一个同名的命名空间,这一点在引入的时候会有体现。

student.rs看一下

pub fn student_num() -> i32 {
    // 代表我这里是120个学生
    120
}

挺简单的,实际上就是在student mod之中创建一个公开的函数,返回一个值,还是要着重一下,student.rs本身就是一个同名mod

teacher.rs看一下

// 创建一个新的mod嵌套
pub mod female_student {
    pub fn female_student_num() -> i32 {
        10
    }
}
 
//尝试一下引入我们的student模块
pub fn total() -> i32 {
    // 1.绝对路径引入 这个路径
    let student_num1 = crate::school::student::student_num();
 
    // 2.使用self进行相对路径的引入
    // 我们用self引入一下mod female_student的内容
    let female_student = self::female_student::female_student_num();
 
    //演示一下super的用法,super就是当前目录的父亲级别的目录,也是就是self的父亲级别
    let student_num2 = super::student::student_num();
 
    // 3.当引入路径又臭又长的时候我们可以使用use关键词,将最后一个模块直接作为包的名字
    use crate::school::woker::male_worker;
    // use crate::school::worker::male_worker as 男性员工;
    // 上面是一个别名设置
    // 这个male_worker就变成了这么大一长串的别名
    let male_worker_num = male_worker::male_worker_num();
    let eqa = student_num1 == student_num2;
    println!("两种测试方式取出的数是否相等:{}", eqa);
    student_num1 + student_num2 + female_student + male_worker_num
}

比较长啊,实际上我用数字标了,整体上就是三个部分:

第一部分是一个绝对路径的引入

let student_num1 = crate::school::student::student_num();

这里的绝对路径不是我们一般的“/”,而是crate关键词开头,那么这个crate具体指的是啥呢,其实,我认为就是src文件夹,这里可以再看一下上面的项目结构,这里是要取student(student.rs)模块之中的函数的返回值,当然要注意一点,中间间隔的这些名称不是文件夹,而是模块。

第二部分是相对路径的引入

let female_student = self::female_student::female_student_num();
 
    //演示一下super的用法,super就是当前目录的父亲级别的目录,也是就是self的父亲级别
let student_num2 = super::student::student_num();

这里是两种情况,首先是self开头的相对路径,实际上就是指的本模块,请问根据上面的teacher.rs,这里的self指的是谁?

再看一下文件,teacher.rs实际上是由一个叫total的函数和模块female_student组成的,这个self在total函数中,当然指的是teacher这个模块啦,female_student是teacher的子模块,接下来就好理解了。

在第二种情况中,super指的就是当前self的父模块,实际就是school,实际使用上来看:mod申明的是个模块,rs文件是个模块,school文件夹也是模块啦

第三部分看一下use关键词

use crate::school::woker::male_worker;
    // use crate::school::worker::male_worker as 男性员工;
    // 上面是一个别名设置
    // 这个male_worker就变成了这么大一长串的别名
    let male_worker_num = male_worker::male_worker_num();

本质上就是这样模块化的写法太长,使用use将长串模块的最后一个名称作为整体的名称,当然也可以使用as的方式创建别名

main.rs拿到模块中的值

teacher.rs返回了一个i32的值,那这个值要怎么拿到呢,看一下上面的项目结构,我们有一个mod.rs的文件如下

pub mod student;
pub mod teacher;
pub mod woker;

这个文件夹的创立是为了申明school文件夹本身是个大模块,同时也是为了让main.rs找到school模块,并使用里面的函数,这里的mod就不是申明模块了,而是引入模块。我们看一下main.rs如何引入

fn main() {
    // 尝试一下引入函数
    let total = school::teacher::total();
    println!("{}", total);
 
}
mod school;
 

这里也有一个mod school作用和上面一样,引入已经申明的模块,运行一下也是成功的

 总结一下就以下几个问题:

1.哪些部分能叫模块(文件夹、rs文件、文件中的mod申明)

2.mod关键词啥作用(文件中申明模块,引入模块)

3.use和pub关键词(缩短路径,外部获取)

4.相对和绝对路径如何拿到模块中的值(self,super)

当然,初学还是有点不太懂的,当个建议记录看看就行

到此这篇关于rust的模块引入的文章就介绍到这了,更多相关rust模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Rust 语言中的dyn 关键字及用途解析

    Rust 语言中的dyn 关键字及用途解析

    在Rust中,"dyn"关键字用于表示动态分发(dynamic dispatch),它通常与trait对象一起使用,以实现运行时多态, 在Rust中,多态是通过trait和impl来实现的,这篇文章主要介绍了Rust 语言中的 dyn 关键字,需要的朋友可以参考下
    2024-03-03
  • libbpf和Rust开发ebpf程序实战示例

    libbpf和Rust开发ebpf程序实战示例

    这篇文章主要为大家介绍了libbpf和Rust开发ebpf程序实战示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 详解Rust 修改源

    详解Rust 修改源

    这篇文章主要介绍了Rust 修改源的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • 详解Rust中的方法

    详解Rust中的方法

    方法其实就是结构体的成员函数,在C语言中的结构体是没有成员函数的,但是Rust毕竟也是一门面向对象的编程语言,所以给结构体加上方法的特性很符合面向对象的特点,这篇文章主要介绍了Rust中的方法,需要的朋友可以参考下
    2022-10-10
  • 深入理解Rust中Cargo的使用

    深入理解Rust中Cargo的使用

    本文主要介绍了深入理解Rust中Cargo的使用,Cargo简化了项目的构建过程,提供了依赖项管理,以及一系列方便的工作流程工具,下面就来具体的介绍一下如何使用,感兴趣的可以了解一下
    2024-04-04
  • 在Rust web服务中使用Redis的方法

    在Rust web服务中使用Redis的方法

    这篇文章主要介绍了在Rust web服务中使用Redis,在这篇文章中,我们将演示如何在一个Rust web应用程序中使用Redis,需要的朋友可以参考下
    2022-08-08
  • Rust处理错误的实现方法

    Rust处理错误的实现方法

    程序在运行的过程中,总是会不可避免地产生错误,而如何优雅地解决错误,也是语言的设计哲学之一。本文就来和大家来了Rust是如何处理错误的,感兴趣的可以了解一下
    2023-03-03
  • 使用Rust开发小游戏完成过程

    使用Rust开发小游戏完成过程

    这篇文章主要介绍了使用Rust开发小游戏的完整过程,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • Rust 枚举和模式匹配的实现

    Rust 枚举和模式匹配的实现

    枚举是 Rust 中非常重要的复合类型,也是最强大的复合类型之一,广泛用于属性配置、错误处理、分支流程、类型聚合等场景中,本文就来介绍一下Rust 枚举和模式匹配,感兴趣的可以了解一下
    2023-12-12
  • Rust字符串类型全解析(最新推荐)

    Rust字符串类型全解析(最新推荐)

    Rust语言中,字符串类型众多,设计初衷是为了确保程序的安全、高效和灵活性,本文详细解释了Rust中不同的字符串类型,感兴趣的朋友跟随小编一起看看吧
    2024-09-09

最新评论