关于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中泛型的学习笔记

    Rust中泛型的学习笔记

    在Rust语言中,泛型是一种强大的工具,它允许我们编写可复用且灵活的代码,本文主要介绍了Rust中泛型的学习笔记,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 使用Rust开发小游戏完成过程

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

    这篇文章主要介绍了使用Rust开发小游戏的完整过程,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • 详解Rust中三种循环(loop,while,for)的使用

    详解Rust中三种循环(loop,while,for)的使用

    我们常常需要重复执行同一段代码,针对这种场景,Rust 提供了多种循环(loop)工具。一个循环会执行循环体中的代码直到结尾,并紧接着回到开头继续执行。而 Rust 提供了 3 种循环:loop、while 和 for,下面逐一讲解
    2022-09-09
  • Rust语言中的String和HashMap使用示例详解

    Rust语言中的String和HashMap使用示例详解

    这篇文章主要介绍了Rust语言中的String和HashMap使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Rust初体验:手把手教你构建‘Hello, World!’

    Rust初体验:手把手教你构建‘Hello, World!’

    "准备好了吗?一起踏上Rust编程语言的精彩旅程!在这篇「Rust初体验」中,我们将手把手教你构建经典程序“Hello, World!”,感受Rust的强大与安全,短短几行代码,就能让你对这个系统级语言的魅力一探究竟!快加入吧,惊喜等你发现!"
    2024-01-01
  • Rust利用tauri制作个效率小工具

    Rust利用tauri制作个效率小工具

    日常使用电脑中经常会用到一个quicke工具中的轮盘菜单工具。但quicke免费版很多功能不支持,且它的触发逻辑用的不舒服,经常误触。所以本文就来用tauri自制一个小工具,希望对大家有所帮助
    2023-02-02
  • rust 一个日志缓存记录的通用实现方法

    rust 一个日志缓存记录的通用实现方法

    本文给出了一个通用的设计模式,通过建造者模式实例化记录对象,可自定义格式化器将实例化后的记录对象写入到指定的缓存对象中,这篇文章主要介绍了rust 一个日志缓存记录的通用实现方法,需要的朋友可以参考下
    2024-04-04
  • Rust调用C程序的实现步骤

    Rust调用C程序的实现步骤

    本文主要介绍了Rust调用C程序的实现步骤,包括创建C函数、编译C代码、链接Rust和C代码等步骤,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • 一文详解Rust中的错误处理

    一文详解Rust中的错误处理

    这篇文章主要为大家详细介绍了Rust中的错误处理的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • rust 中生成与使用protobuf的方法

    rust 中生成与使用protobuf的方法

    这篇文章主要介绍了rust中protobuf生成与使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05

最新评论