当你开始构建一个大项目的时候,你就能体会到把所有代码都写在一个文件里是多么智障了:不仅难以定位负责某一功能的代码,一大片代码直接糊你脸上也觉得头晕。

当然作为一个现代语言,rust也肯定有相应的措施,就是模块系统


现在让我们用一个例子来解释它!

我们将实现一个能处理某些文件格式的东西。当然,我们只是做示例,并不需要实现具体的功能。只需要让它输出一些东西,让我们知道代码正常运行就好!

现在它大概如下所示:

fn file_mp4() {output();println!("mp4! ");
}fn file_jpg() {output();println!("jpg! ");
}fn file_zip() {output();println!("zip! ");
}fn output() {println!("output: ");
}fn main() {file_mp4();file_jpg();file_zip();
}/** 输出:** output:* mp4!* output:* jpg!* output:* zip!*/

很符合常理是吧?那么接下来我们用模块重构它:

mod file {pub fn mp4() {output();println!("mp4! ");}pub fn jpg() {output();println!("jpg! ");}pub fn zip() {output();println!("zip! ");}fn output() {println!("output: ");}
}fn main() {file::mp4();file::jpg();file::zip();
}/** 输出:** output:* mp4!* output:* jpg!* output:* zip!*/

是不是有点晕?没关系,让我们一个一个刨析它。


mod(模块)

从第一行看起是不是就有些晕?

mod file

mod全称module,也就是模块。那么顾名思义,mod就是用来声明一个模块的。后面紧跟模块名。

mod内可声明各种各样的东西,比如函数。但是如果你曾试过的话,会发现mod内竟能声明与外部名字相同的函数(或者其他东西)!这其实是因为它们在不同的命名空间(namespace)中。这样理解嘛,外部是一个房间,mod里面又是一个房间,这两个房间互不干扰,也就不存在相同名字冲突的问题了。但是这样问题又来了,如何访问不同房间中的东西呢?其实从上面的代码中我们就能获取到一些信息:

file::mp4();
file::jpg();
file::zip();

按照上面的用法来的话就是:模块名 + 域解析操作符(::) + 要使用的东西

可以看出,域解析操作符就能让我们访问到另一个命名空间内的标识符。

pub(可见性)

接着看,第二行后半部分是声明一个函数,但是前面多了一个pub。

pub fn mp4()

pub全称public,也就是公开的意思。

你可能会想:平时我写函数也没加pub,不照样到处都能用吗?这个pub有什么意义?

拿上面命名空间的例子:如果别人要访问你的房间,那你肯定不希望把自己私密的东西让别人访问吧,这就是不公开;当然也不可能让别人访问了个空气,所以你可以把那些正常的东西给公开(pub)。

再换到编程里,就是公开那些别人需要用的东西,屏蔽掉内部的细节。

我们可以举个......啊我们可以直接看上面的代码:

fn output() {println!("output: ");
}

这个函数并没有加pub,意味着它只能在mod内部被调用。在外部即使去用域解析操作符也无法访问。

咳咳,上面只讲了函数pub的内容,所以这里再扩充一下struct和enum的:

先说struct的。struct默认也不公开。但是!只给struct自身加pub是不行的,要想完全公开必须给下面的成员也加上pub,因为即使struct公开了,但是其成员任然是不公开的。

pub struct FileData {pub name: String,pub size: u32,
}

那这里我们还可以引出一个新问题来!由于可见性规则,其中哪怕有一个成员不公开,我们也无法手动创建这个结构体的具体内容。怎么办?用构造函数!顾名思义*n,就是提供一个函数来构造这个东西的具体内容嘛。具体实现:

mod file {pub struct FileData {pub name: String,pub size: u32,}impl FileData {pub fn new(name: String) -> FileData {FileData {name,size: 0,}}}// 此处省略其他代码...
}fn main() {let x = file::FileData::new(String::from("err.go"));println!("{}", x.name);}/** 输出:** err.go*/

别忘记加上pub哦!

再是enum。enum与struct有点不同,将自身公开后就可以正常使用。而不是像struct还要公开其成员。具体实现:

mod file {pub enum FileType {mp4,jpg,zip,other, // 其他文件格式}// 此处省略其他代码...
}fn main() {let x = file::FileType::zip;
}


所以说呢?你这代码不还是都写在一个文件里吗?

所以这就是下章我准备讲的内容,敬请期待吧~

P.S. 文章为了对小白保持友好,所以并没有用难理解的词汇,即使用了也会给出解释。

rust怎么进入好友的房间_Rust基础知识-模块系统(上)相关推荐

  1. 最容易理解的计算机网络的基础知识概论(上)

    最容易理解的计算机网络基础知识概论(上) 1.计算机网络的分类方法 1)广域网. 2)城域网. 3)局域网. 4)个人区域网和人体区域网. 2.计算机的组成及结构 2.1早期计算机网络组成与结构 3 ...

  2. 小学计算机学科知识与能力,学科知识与能力:计算机基础知识模块知识点分析...

    学科知识与能力:计算机基础知识模块知识点分析来源于浙江教师教育网 中公教师通过对全国教师资格考试考情的分析,总结出全国教师资格考试<信息技术学科知识与能力>计算机基础知识模块的知识点,并提 ...

  3. C#基础知识 课堂笔记 上

    2017-08-19 第一次写博,不知道该写些什么,就把学习了一周C# 编程语言的部分基础知识,分享给大家,希望对大家有所帮助,也希望大牛们,能不吝赐教,指出不足之处,谢谢!!! 第一章 开发入门 1 ...

  4. 网络基础知识 第一章上

    欢迎大家参加"思科网院杯"大学生网络技术大赛.本竞赛主要考察选手的网络基础知识,题目难度远比ACM等编程比赛简单,适合大一新生参加.只要你对计算机网络感兴趣,愿意学习网络知识,即可 ...

  5. 机器视觉基础知识/经典系统/常用领域以及机器视觉常用的图像处理库

    [0-定义] **计算机视觉:**一门研究如何使机器"看"的科学,更进一步的说,就是指用摄影机和计算机代替人眼对目标进行识别.跟踪和测量等机器视觉,并进一步做图像处理,用计算机处理 ...

  6. 大数据系列sql基础知识(史上最全,收藏起来)

    大数据系列文章,从技术能力.业务基础.分析思维三大板块来呈现,你将收获: 1. 提升自信心,自如应对面试,顺利拿到实习岗位或offer: 2.掌握大数据的基础知识,与其他同事沟通无障碍: 3. 具备一 ...

  7. 计算机发展史-计算机基础知识总结(上)

    随着计算机技术的不断发展,计算机已经成为人们日常生活中必不可少的一部分,而且它也对人类社会产生了巨大的影响.本文将从计算机的发展历史.计算机硬件和软件.操作系统.计算机网络.数据库等方面进行系统的介绍 ...

  8. 100 个网络基础知识普及(上)

    1)什么是链接? 链接是指两个设备之间的连接.它包括用于一个设备能够与另一个设备通信的电缆类型和协议. 2)OSI 参考模型的层次是什么? 有 7 个 OSI 层:物理层,数据链路层,网络层,传输层, ...

  9. 1.7 Python基础知识 - 模块初识

    在Python中有很多模块,模块对应的就是python源代码文件.模块中有Python程序自己附带的标准模块,还有很多其他人共享的第三方模块.模块中可以定义变量.函数和类.而多个功能类似的模块可以组织 ...

最新文章

  1. 【转载】flash时间轴中变量的作用域
  2. Learning Face Age Progression: A Pyramid Architecture of GANs
  3. docker构建oracle集群,docker 构建 oracle数据库 镜像-Go语言中文社区
  4. celery mysql 异步_celery配合rabbitmq任务队列实现任务的异步调度执行[celery redis]
  5. java找出所有缺席人员,GitHub - uxzhen/Java: 假娃会迟到,但不会缺席!http://xuzhen.work:8080/getAll...
  6. VMware workstation 磁盘扩容
  7. 实践SaltStack安装和配置管理
  8. 2、python的print函数格式化输出
  9. 语音信号处理(九)——离散余弦变换
  10. Java基础如何运用FileOutputStream
  11. spark性能调优:资源优化
  12. putty 使用perm密钥文件登陆堡垒机
  13. Step By Step(1),Build Convolutional Neural Networks
  14. 零食店投资?市场成本风险分析
  15. 为什么我们不能坚持到底?
  16. Ubuntu 20.04.5安装无线网卡RTL8821CE驱动
  17. A调用B方法,@Transactional事务问题
  18. 仿微信录音功能-(声波动画,上滑取消,超时截取,倒计时提醒)
  19. VS2010开发体验系列之二 - 语言C#4.0
  20. javaweb失物招领网站源码

热门文章

  1. tp5.0 根据经纬度 获取附近信息_php根据前端传递的经纬度获取区域地址信息
  2. 神经网络的量子化假设
  3. html 屏蔽蓝色电话,html – 在Chrome扩展程序中停用文字字段蓝色突出显示?
  4. halcon入门_visionpro和halcon这两款机器视觉软件区别
  5. Linux循环链表删除节点,删除循环单链表开头元素
  6. P11 非线性系统-《Matlab/Simulink与控制系统仿真》程序指令总结
  7. A组包含的前导码数( sizeOfRA-PreamblesGroupA)
  8. 【PC工具】chrome插件:n多好用实用chrome插件
  9. 更新网盘(云存储)功能需求,免费网盘需求,手机数据备份
  10. c语言ascii图形输出,C语言实例10——有关ASCII图形的输出