我的编程空间,编程开发者的网络收藏夹
学习永远不晚

关于rust的模块引入问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

关于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包当中的一个函数,就这么简单,下面看一下我的结构

 很简单啊,class="lazy" data-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具体指的是啥呢,其实,我认为就是class="lazy" data-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模块内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

关于rust的模块引入问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

关于python中pika模块的问题

工作中经常用到rabbitmq,而用的语言主要是python,所以也就经常会用到python中的pika模块,但是这个模块的使用,也给我带了很多问题,这里整理一下关于这个模块我在使用过程的改变历程已经中间碰到一些问题的解决方法刚开写代码的小
2023-01-30

关于模块EXPORT_SYMBOL()变量的问题

EXPORT_SYMBOL()是Linux内核中的一个宏,用于将一个变量或函数导出为一个可供其他模块访问的符号。在模块化的内核中,模块之间需要通过符号来进行通信和交互。EXPORT_SYMBOL()宏的作用是告诉内核,将某个变量或函数导出为
2023-08-08

关于python 缺少dbm模块问题

今天在 CentOS 5.6  64位的机器上配置Func被控端时,在安装设置完 Func 及 Certmaster 后,启动 Funcd 提示如下错误 [root@certmaster ~]#service funcd start  St
2023-01-31

python模块引入问题如何解决

这篇文章主要介绍“python模块引入问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python模块引入问题如何解决”文章能帮助大家解决问题。1.pycharm运行python脚本的过程
2023-07-05

python模块引入问题和解决方案

本文主要介绍了python模块引入问题和解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-09

如何解决SpringBoot引用别的模块无法注入的问题

小编给大家分享一下如何解决SpringBoot引用别的模块无法注入的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!引用别的模块无法注入的问题前段时间尝试着利用
2023-06-29

关于pycharm中导入自己写的模块没有

在pycharm界面中右击py文件所在的文件夹,选择Make Directory as文件,选择其中一个即可
2023-01-31

Python 模板引擎的注入问题分析

这几年比较火的一个漏洞就是jinjia2之类的模板引擎的注入,通过注入模板引擎的一些特定的指令格式,比如 {{1+1}} 而返回了 2 得知漏洞存在。实际类似的问题在Python原生字符串中就存在,尤其是Python 3.6新增 f 字符串
2022-06-04

关于使用rust调用c++静态库并编译nodejs包的问题

这篇文章主要介绍了使用rust调用c++静态库并编译nodejs包的问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-11-13

Python导入模块常见的问题有哪些

1. 导入的模块不存在:如使用了错误的模块名或者没有安装对应的模块。2. 模块中的函数或者变量不存在:如使用了模块中不存在的函数或者变量。3. 循环导入:当两个或者多个模块相互导入时可能会出现循环导入的问题。4. 模块导入路径问题:如果模块
2023-10-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录