关于rust的模块引入问题

目录
  • Rust语言的特点
  • Rust的应用
  • worker.rs文件,简单看一下
  • student.rs看一下
  • teacher.rs看一下
  • 第一部分是一个绝对路径的引入
  • 第二部分是相对路径的引入
  • 第三部分看一下use关键词

国庆第一次学习,真是太罪恶了,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模块内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入讲解下Rust模块使用方式

    目录 前言 模块声明&使用 方法一:直接在根文件下声明add.rs 方法二:声明add文件夹,文件夹下包含mod.rs 方法三:add.rs和add文件夹同时存在 同模块相邻文件引用 不同模块引用 小结 前言 本文适用于刚开始学习rust的同学,用于帮助理解rust模块间是如何相互引用的.本文尽量用极少的代码来演示,即便之前没有了解过rust也可以混个眼熟.用的时候可以有个印象. 如果你之前没有了解过rust,只需要知道:Cargo-依赖管理工具,类似于npm,Cargo 使用文件放置约定,即文

  • Rust use关键字妙用及模块内容拆分方法

    目录 前言 1.rust 中的use关键字 1.1.将模块标识符引入当前作用域 1.2.use特点与习惯用法 1.3.使用pub use 重新导出名称 1.4.使用外部包(package)以及标准库 1.5.使用嵌套路径清理大量 use 语句 1.6.通配符 * 2.模块内容拆分 前言 书接上文,本篇补充rust 组织管理中模块的细节知识,比如模块拆分.此外介绍use关键字的习惯用法,快速引用自定义模块内容或标准库,以此优化代码书写. 1.rust 中的use关键字 如果我说use与C/C++中

  • 关于rust的模块引入问题

    目录 Rust语言的特点 Rust的应用 worker.rs文件,简单看一下 student.rs看一下 teacher.rs看一下 第一部分是一个绝对路径的引入 第二部分是相对路径的引入 第三部分看一下use关键词 国庆第一次学习,真是太罪恶了,555 主要还是看这个官网学的,这一部分对应的是官网上那个教程的第七章,写的实在是让人有点费解,所以我这边自己写一下,当然范围限制在第七章,因为我暂时只是看到哪里 Rust 语言是一种高效.可靠的通用高级语言.其高效不仅限于开发效率,它的执行效率也是令

  • Golang 模块引入及表格读写业务快速实现示例

    目录 介绍 正文 配置模块引入环境 引入excelize库 创建表格 读取表格 写入表格 结语 介绍 在很多管理系统下都有不少让后端进行表格进行操作的业务需求,本期就带大家了解一下Golang中如何使用模块引入的,以及讲解怎么快速的使用excelize库,对表格进行读写创建的. 正文 配置模块引入环境 我们在期望在vscode终端中也可以使用模块引入,它是 Go 1.11后新版模块管理方式. go env -w GO111MODULE=auto 其 GO111MODULE 可以传递: auto:

  • nodejs操作mongodb的填删改查模块的制作及引入实例

    安装相关模块 如果使用这个的话,你需要先自己安装一下他需要的模块,在根目录输入 npm install mongodb --save 进行模块安装,安装成功以后就可以进行以下的步骤. 文件的引入 以下是我书写的相关代码,放到你可以引用的相关目录,本人放到了express的根目录 function Mongo(options) { this.settings = { url: 'mongodb://localhost:27017/jk', MongoClient:require('mongodb'

  • SpringBoot2.x入门教程之引入jdbc模块与JdbcTemplate简单使用方法

    前提 这篇文章是<SpringBoot2.x入门>专辑的第7篇文章,使用的SpringBoot版本为2.3.1.RELEASE,JDK版本为1.8. 这篇文章会简单介绍jdbc模块也就是spring-boot-starter-jdbc组件的引入.数据源的配置以及JdbcTemplate的简单使用.为了让文中的例子相对通用,下文选用MySQL8.x.h2database(内存数据库)作为示例数据库,选用主流的Druid和HikariCP作为示例数据源. 引入jdbc模块 引入spring-boo

  • Rust如何进行模块化开发技巧分享

    目录 Rust如何进行模块化开发? Package和Create Cargo的惯例 Create的作用 定义module来控制作用域和私有性 路径Path 私有边界(private boundary) pub关键字 super关键字 pub struct pub enum Use关键字 use的习惯用法 as关键字 使用 pub use 重新导出名称 导入外部包 如何将模块放入其他文件? 类似es6的模块化,Rust通过package.create.module来实现代码的模块化管理 Rust如

  • Rust包和Crate超详细讲解

    目录 包和crate 模块控制作用域与私有性 use 进行模块引入 包和crate 通过相关功能进行分组和划分不同的功能代码, 将代码分割成多个模块和多个文件组织代码, 一个包包含 多个crate 和一个可选的crate, Cargo 类似C++ 提供一个工作空间命名 类似JAVA中包空间. 避免重复造轮子, 其他代码通过公关接口进行调用. 模块系统: 包,Crates(模块树形结构,库和二进制项目), 模块, 路径. *crate 是一个二进制项/ 库, rust编译以crate root源文

  • Python中标准模块importlib详解

    1 模块简介 Python提供了importlib包作为标准库的一部分.目的就是提供Python中import语句的实现(以及__import__函数).另外,importlib允许程序员创建他们自定义的对象,可用于引入过程(也称为importer). 什么是imp? 另外有一个叫做imp的模块,它提供给Python import语句机制的接口.这个模块在Python 3.4中被否决,目的就是为了只使用importlib. 这个模块有些复杂,因此我们在这篇博文中主要讨论以下几个主题: •动态引入

  • 浅谈node模块与npm包管理工具

    在Node.js中,以模块为单位划分所有的功能,并且提供了一个完整的模块加载机制,所以我们可以将应用程序划分为各个不同的部分,并且对这些部分进行很好的协同管理.通过将各种可重用代码编写在各种模块中的方法,可以大大减少应用程序的代码量,提高应用程序的开发效率以及应用程序代码的可读性.通过模块加载机制,可以将各种第三方模块引入到我们的应用程序中. 在node.js中,提供npm包管理工具,用于从第三方网站上下载各种Node.js包. 一.模块 1.1 加载模块 在Node.js中,以模块为单位划分所

  • nodeJS模块简单用法示例

    本文实例讲述了nodeJS模块简单用法.分享给大家供大家参考,具体如下: 1.定义Student模块,Teacher模块 function add(student){ console.log('Add Student:'+student); } exports.add=add; function add(teacher){ console.log('Add Teacher:'+teacher); } exports.add=add; 2.定义kclass模块 //引入student模块 var

随机推荐