首页 > 其他分享 >rust学习八、包和模块

rust学习八、包和模块

时间:2024-11-13 18:45:31浏览次数:1  
标签:use student pub 学习 模块 teacher rust

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

我们可以看懂熟悉的字眼:包括、模块、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可以做到重导出作用

 

标签:use,student,pub,学习,模块,teacher,rust
From: https://www.cnblogs.com/lzfhope/p/18544487

相关文章

  • 大数据学习13之Scala基础语法(重点)
    1.简介        Scala是ScalableLanguage的简写,是一门多范式的编程语言。创始人为MartinOdersky马丁·奥德斯基。        Scala这个名字来源于ScalableLanguage(可伸缩的语言),它是一门基于JVM的多范式编程语言,通俗的说:Scala是一种运行在JVM上的......
  • Rust 在 Android 的编程实践——技术驱动的车云一体化解决方案探索
    Greptime车云一体化解决方案颠覆了从前传统的车云协同模式,采用更加低成本、高效率的方案来满足当前的市场需求。其中GreptimeDBEdge作为核心组件,专为车机环境量身打造。本文旨在详尽探讨在Android平台利用Rust语言进行开发过程中所积累的经验和教训。交叉编译在车机场景......
  • starrycan的pwn学习记录1
    一.Introducation0x01简介CTF0x02什么是pwn”Pwn”是一个黑客语法的俚语词,是指攻破设备或者系统。发音类似“砰”,对黑客而言这就是成功实施黑客攻击的声音--砰的一声,被“黑”的电脑或手机就被你操纵了。CTF中的pwnCTF中的PWN主要是针对于二进制漏洞挖掘与利用,通常情况下选......
  • 用函数实现模块化程序设计四
    数组作为函数参数调用有参函数时,需要提供实参,实参可以是常量、变量或表达式数组元素的作用与变量相当,一般来说,凡是变量可以出现的地方,都可以用数组元素代替,因此,数组元素也可以用作函数实参,其用法与变量相同,向形参船体数组元素的值。此外,数组名也可以作实参和形参,传递的是数组第......
  • Rust枚举之卧龙凤雏(Rust Option枚举、Rust Result枚举)(Rust Enum、Some(T)、Ok(T)、Err
    文章目录Rust枚举之卧龙凤雏枚举的基本概念枚举定义示例Result枚举:凤雏Result枚举的定义Result的使用场景示例1:文件读取示例2:链式操作与错误处理Option枚举:卧龙Option枚举的定义Option的使用场景示例1:从字符串解析数字示例2:链式操作总结Rust枚举之......
  • 学术论文写作丨机器学习与深度学习
    目录第一章、ChatGPT-4o使用方法与技巧第二章、ChatGPT-4o辅助文献检索、总结与分析第三章、ChatGPT-4o辅助学术论文选题、创新点挖掘与实验方案设计第四章、ChatGPT-4o辅助学术论文开题与大纲生成第五章、ChatGPT-4o辅助学术论文写作马拉松活动介绍第六章、ChatGPT-4o辅......
  • Java学习之定时任务框架Quartz
    Quartz的核心类有以下三部分:Job:需要实现的任务类,实现execute()方法,执行后完成任务。Trigger:包括SimpleTrigger和CronTrigger。Scheduler:任务调度器,负责基于Trigger触发器,来执行Job任务。简单示例1.pom配置 2.创建JobpublicclassEplJobimplementsJob{......
  • UDP 协议 - 学习笔记
    摘要:本文原创,转载请注明地址https://www.cnblogs.com/baokang/p/18543885一、UDP是什么UDP(UserDatagramProtocol)用户数据报协议是运输层协议的一种,是一种无连接的数据传输协议二、UDP协议的特点(1)UDP是无连接的,发送数据前不需要建立连接,因此减少的发生数据量和发送数据......
  • vite 虚拟模块初识
    介绍:Vite中的虚拟模块Vite是一个现代化的构建工具,旨在通过利用浏览器原生ES模块的可用性以及使用编译为原生语言编写的JavaScript工具来解决一些问题。用途:1.自动生成路由配置:在一些前端框架(如Vue和React)中,虚拟模块可以用来动态生成路由配置。通常,我们需要手动维护路......
  • 【算法学习】单调队列优化dp
    前言这已经是很基础很模板化的优化了,我们可以理解为用贪心的思路去掉了永远不可能用到的状态,通常用于长度固定是个区间、最大值且满足单调性的题目。如果一个选手比你小,还比你强,你就永远也打不过他了。这很残酷但这也是单调队列的思想,虽然现实情况比较多变。P3572[POI2014]PT......