rust学习八、包和模块

news/2024/11/13 18:58:11/文章来源:https://www.cnblogs.com/lzfhope/p/18544487

总体上,也没有什么特别的地方,和其它语言比较起来。

我们可以看懂熟悉的字眼:包括、模块、use、公共等等

如果是英文,则需要知道crate、pub。

本章节对应相关书籍的第七章节.

一、一个rust可执行程序的大体结构

就本章节而言,尚未接触到一个非常复杂的工程结构,据说有什么工作空间。

不考虑工作空间,那么一个rust可执行应用大概如下:

 

所谓的单元包即"crate"。

crate - 木箱、一箱 等含义。为了方便我们翻译为单元包,小包。

这是因为package已经约定成俗翻译为"包“,那么crate作为一个程序容器,翻译为”小包、单元包"也是可以的。

如果要这个程序可以执行,则至少应该包含一个二进制可执行包,即src/main.rs,其中应该有main()入口。

而这个package反而有点类似于maven工程,cargo new 就是创建一个 package(工程):

 

如果你熟悉java编程,那么rust的package,crate大体可以等价于:

rust                 java

---------------------------------------------

package-        project

crate               package

 

 

单元包分类

 

强调几点:

  1. 外部单元包一般通过cargo install 安装到Cargo.toml中
  2. 库单元位于src/lib.rs中。可以使用 cargo new --lib xxx 来创建一个库单元包,而不是一个包含了二进制单元包的可执行程序

 

下图包含了两个示例:lzfmatch(库单元包), school(一个可执行程序,包含了一个二进制单元)

 

 单元包组成

 

图看起来好像复杂,例子反而简单。

二、模块系统

换一个角度,一个应用程序,就是无数模块构成的.

和其它大部分语言一样:可以模块嵌套模块;模块嵌套的层次没有明说(应该也不会有那么疯狂自找麻烦的)

图_单元包和模块的简单关系示意

 

实际可以嵌套很多层次。

三、示例

如果看不太明白,或者不太想看,那么直接看例子最直接的。

3.1、结构

包含了两个二级模块student,teacher,以及5个三级子模块。

 

操作系统文件结构

从上图可以看出:

模块student的子包位于同名子目录下student/stuent_course.rs,student/student_info.rs

模块teacher的子包是内联的(即和teacher自身同个文件)

/*** 子模块1-通用*/
pub mod teacher_common {pub fn teach() {println!("老师在上课");super::teacher_inner::learn();   //即使和被访问对象位于同个父亲下两个子模块下,两个子模块内的方法也只能访问对方公共的成员//super::teacher_inner::laugh(); //企图访问私有成员会编译错误的。
    }
}/*** 子模块2-家庭*/
pub mod teacher_family {}/*** 内部模块-私有*/
mod teacher_inner {/*** 即使处于同个层级,如果不定义为pub,其它同层级的方法也无法访问,因为毕竟属于不同模块*/pub fn learn() {}fn laugh(){println!("老师在笑");}
}pub fn go() {println!("教师模块");
}

 

 

3.2、 引入/引用说明

//use crate::student::student_info::stru_student;   //通常不要那么麻烦,还要加crate
use student::student_info::stru_student;  //引入单个
use student::student_info::*;  //引入所有的,不要那么麻烦
use student::student_course::Course as Subject;  //引入单个且用别名

mod teacher;
mod student;fn main() {teacher::go();    student::go();//直接使用子模块的子模块方法
    teacher::teacher_common::teach();let stu=stru_student{name:"tom".to_string(),sex:"".to_string(),age:12,};print_student(stu);let sub=Subject::汉语;print!("{:?}",sub);
}

 

上文演示了3种常用的use语法。

注意:由于这些模块都是位于本单元包内,所以需要先用 mod xxx的语法引入模块,然后再使用use语句引入模块内对象(类型、方法等)

 

3.3、pub use

rust还有一个比较独特的pub use,原文的意思是(re-exporting),意思是如果被的作用域导入当前模块,那么可以访问这里pub use的对象。

我们来做个例子:

1.为teacher模块新增子模块study,study下有函数study_hard

2.在teacher中pub use study::study_hard

3.在main.rs种使用

 

四、小结

  1. 虽然粗看起来,rust的程序组织有点小复杂,但是和大部分语言没有什么区别,和java很像
  2. rust通过包、单元包(二进制、库)、模块来组织应用中的代码
  3. 一个单元包可以包含许多模块
  4. 模块可以包含子模块
  5. 模块之间的嵌套层次没有明确的限定,但不会有人嵌套太多层次
  6. rust利用pub use可以做到重导出作用

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/833081.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

starrycan的pwn学习记录1

一.Introducation 0x01 简介CTF 0x02 什么是pwn ”Pwn”是一个黑客语法的俚语词,是指攻破设备或者系统 。发音类似“砰”,对黑客而言这就是成功实施黑客攻击的声音--砰的一声,被“黑”的电脑或手机就被你操纵了。 CTF中的pwn CTF中的PWN主要是针对于二进制漏洞挖掘与利用,通…

计算机组成原理与操作系统 第二章 处理机组成与管理

目录1.CPU的功能和组成1.1CPU的四大功能1.2CPU的基本组成1.3 一条指令如何在CPU内运行2.指令系统2.1机器语言与指令2.1.1基本概念2.1.2一条指令一般应包含的信息2.1.3指令的类型与功能2.1.4寻址方式2.2指令格式的设计2.2.1基本概念2.2.2指令类型2.2.3操作码类型2.2.4指令设计2.…

UWB无线通信技术

UWB定位与通信技术标准第2章 UWB无线通信技术 UWB(超宽带)技术最早诞生于无线通信领域,该新兴技术一出现就备受关注UWB信号有着极大的带宽,其时间分辨率高、抗多径效应能力强,被认为是高速率短距离无线通信中具有很强竞争力的候选方案之一为此,本章寻根溯源,从UWB无线通…

极速启动,函数计算弹性降本能力再升级

本文将深入探讨函数计算如何通过技术革新实现提效降本,以及其在 AI 业务、数据处理和 Web 应用等多个领域的广泛应用。作者:墨飏 在数字化转型的大潮中,云计算成为推动创新和优化业务流程的关键力量。作为阿里巴巴集团的核心产品之一,函数计算(Function Compute)引领着 S…

用函数实现模块化程序设计四

数组作为函数参数数组作为函数参数 调用有参函数时,需要提供实参,实参可以是常量、变量或表达式 数组元素的作用与变量相当,一般来说,凡是变量可以出现的地方,都可以用数组元素代替,因此,数组元素也可以用作函数实参,其用法与变量相同,向形参船体数组元素的值。此外,…

Vulnhub W1R3S: 1.0.1

Vulnhub W1R3S: 1.0.1 0x01:端口扫描 主机发现,靶机ip:192.168.231.133 nmap -sn 192.168.231.0/24-sn 仅主机扫描 /24 扫描c段详细全端口扫描 nmap -sT -sC -sV -O -p21,22,80,3306 192.168.231.133 -oA /root/scan/1/-sT: 以TCP进行扫描; -sC:使用 nmap 的默认脚本集合进…

永宏BI 自定义绘图(环状图)

结果样式:绑定数据:自定义JS代码:点击查看代码 option = {tooltip: {trigger: item,formatter: {a} <br/>{b}: {c} ({d}%)},series: [{type: pie,radius: [50%, 70%],avoidLabelOverlap: false,label: {show: false,position: center},emphasis: {label: {show: false…

Privilege Escalation(权限提升)

Privilege Escalation(权限提升) What the Shell? What is a shell shell 是我们与命令行环境 (CLI) 交互时使用的工具。换句话说, Linux中常见的 bash 或 sh 程序都是 shell 的例子,Windows 上的 cmd.exe 和 Powershell 也是如此。 简而言之,我们可以强制远程服务器向我们…

30 秒!用通义灵码画 SpaceX 星链发射流程图

30 秒!用通义灵码画 SpaceX 星链发射流程图不想读前人“骨灰级”代码, 不想当“牛马”程序员, 想像看图片一样快速读复杂代码和架构? 来了,灵码又加新 buff!!通义灵码支持代码逻辑可视化, 可以把你的每段代码画成流程图。 你可以把它当成一个超级脑图工具, 帮你快速画…

大模型--Megatron TP张量并行-15

目录1. 参考2. 介绍3. 权重的切分3.1 按行切分权重3.2 按列切分权重4. MLP层5. Self-Attention层6. Embedding层7. Cross-entropy层8. 张量模型并行 + 数据并行 1. 参考 https://zhuanlan.zhihu.com/p/622212228 2. 介绍 流水线并行 数据并行(DP,DDP和ZeRO) 介绍最重要,也是…