关于rust的模块引入问题

2022-11-13 18:11:06 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模块内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关文章