rust学习八、包和模块

打印 上一主题 下一主题

主题 857|帖子 857|积分 2571

总体上,也没有什么特别的地方,和其它语言比较起来。
我们可以看懂熟悉的字眼:包罗、模块、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
 
 
单元包分类

 
强调几点:

  • 外部单元包一样平常通过cargo install 安装到Cargo.toml中
  • 库单元位于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. /**
  2. * 子模块1-通用
  3. */
  4. pub mod teacher_common {
  5.     pub fn teach() {
  6.         println!("老师在上课");
  7.         super::teacher_inner::learn();   //即使和被访问对象位于同个父亲下两个子模块下,两个子模块内的方法也只能访问对方公共的成员
  8.         //super::teacher_inner::laugh(); //企图访问私有成员会编译错误的。
  9.     }
  10. }
  11. /**
  12. * 子模块2-家庭
  13. */
  14. pub mod teacher_family {}
  15. /**
  16. * 内部模块-私有
  17. */
  18. mod teacher_inner {
  19.     /**
  20.      * 即使处于同个层级,如果不定义为pub,其它同层级的方法也无法访问,因为毕竟属于不同模块
  21.      */
  22.     pub fn learn() {}
  23.     fn laugh(){
  24.         println!("老师在笑");
  25.     }
  26. }
  27. pub fn go() {
  28.     println!("教师模块");
  29. }
复制代码
 
 
3.2、 引入/引用阐明
  1. //use crate::student::student_info::stru_student;   //通常不要那么麻烦,还要加crate
  2. use student::student_info::stru_student;  //引入单个
  3. use student::student_info::*;  //引入所有的,不要那么麻烦
  4. use student::student_course::Course as Subject;  //引入单个且用别名
  5. mod teacher;
  6. mod student;
  7. fn main() {
  8.     teacher::go();   
  9.     student::go();
  10.     //直接使用子模块的子模块方法
  11.     teacher::teacher_common::teach();
  12.     let stu=stru_student{
  13.         name:"tom".to_string(),
  14.         sex:"男".to_string(),
  15.         age:12,
  16.     };
  17.     print_student(stu);
  18.     let sub=Subject::汉语;
  19.     print!("{:?}",sub);
  20. }
复制代码
 
上文演示了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种使用


 
四、小结


  • 虽然粗看起来,rust的步调构造有点小复杂,但是和大部分语言没有什么区别,和java很像
  • rust通过包、单元包(二进制、库)、模块来构造应用中的代码
  • 一个单元包可以包含许多模块
  • 模块可以包含子模块
  • 模块之间的嵌套条理没有明白的限定,但不会有人嵌套太多条理
  • rust利用pub use可以做到重导出作用
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表