当前位置: 首页 > news >正文

关于Rust的项目结构的笔记

层级

  • Package
  • Crate
  • Module
  • Path

Package

cargo的特性, 构建、测试、共享Crate

组成:

  • 一个 Cargo.toml 文件, 描述了如何构建这些 Crates
  • 至少包含一个 crate
  • 最多只能包含一个 library crate
  • 可以包含任意个 binary crate

cargo new demo-pro

会产生一个名为 demo-pro 的 Package

目录结构如下:
在这里插入图片描述

cargo 的惯例:

  1. src/main.rs 是 binary crate 的 crate root
    且此crate的名称与package名一致

  2. src/lib.rs 是 library crate 的 crate root (此文件需要自己创建)
    且此crate的名称与package名一致

cargo 会把 crate root 文件交给 rustic 来构建 library 或 binary

  1. 一个package 可以有多个 binary crate
    在这里插入图片描述

Crate

一个模块树, 可以产生一个 library 或 可执行文件


Crate 类型:

  • binary 二进制文件
  • library 库文件

Crate Root:

  • 是源代码文件
  • rustc 从这里开始组成项目的根Module

Module

控制代码的组织、作用域、私有路径


  • 在一个 crate 内可以将代码进行分组
  • 易于复用
  • 控制项目私有性
  • 使用 mod 关键字进行创建
  • 可以嵌套
  • 可以包含其他项的定义(struct , enum, trait, fn)

案例1:

src/lib.rs

mod front_of_house {mod hosting {fn add_to_waitlist() {}fn seat_at_table() {}}mod serving {fn take_order() {}fn serve_order() {}fn take_payment() {}}
}

在这里插入图片描述

案例2:

src/lib.rs

pub mod front_of_house {pub mod hosting {pub fn add_to_waitlist() {}pub fn seat_at_table() {}}pub mod serving {pub fn take_order() {}pub fn serve_order() {}pub fn take_payment() {}}
}pub fn eat_at(){crate::front_of_house::hosting::add_to_waitlist();
}

src/main.rs

fn eat_at2(){demo_pro::front_of_house::hosting::add_to_waitlist();
}fn main() {eat_at2();
}

案例3: super

src/lib.rs

pub mod front_of_house {fn method1() {}pub mod hosting {fn method2() {}pub fn method3() {method2();super::method1();// orcrate::front_of_house::method1();}}
}

案例4 use 关键字

src/lib.rs

pub mod front_of_house {fn method1() {}pub mod hosting {fn method2() {}pub fn method3() {method2();super::method1();// orcrate::front_of_house::method1();}}
}use crate::front_of_house::hosting;pub fn eat_at3(){hosting::method3();
}

src/main.rs

use std::collections::HashMap;fn main() {let mut map = HashMap::new();map.insert(1, 2);
}

案例5 as 关键字

src/main.rs

use std::collections::HashMap as MyMap;fn main() {let mut map = MyMap::new();map.insert(1, 2);
}

案例6 pub use

重新导出

案例7 将模块重新拆分为不同文件

理论:
在这里插入图片描述

  1. 一级拆分 (等同案例4的效果)

在这里插入图片描述

src/lib.rs

pub mod front_of_house;use crate::front_of_house::hosting;pub fn eat_at3(){hosting::method3();
}

src/front_of_house.rs

fn method1() {}pub mod hosting {fn method2() {}pub fn method3() {method2();super::method1();// orcrate::front_of_house::method1();}
}
  1. 二级拆分 (等同案例2的效果)

在这里插入图片描述

src/lib.rs

pub mod front_of_house;pub fn eat_at(){crate::front_of_house::hosting::add_to_waitlist();
}

src/front_of_house.rs

pub mod hosting;pub mod serving;

src/front_of_house/hosting.rs

pub fn add_to_waitlist() {}
pub fn seat_at_table() {}

src/front_of_house/serving.rs

pub fn take_order() {}
pub fn serve_order() {}
pub fn take_payment() {}

相关文章:

  • 打开snipaste软件的界面后,上次的截图无法销毁?
  • schweizer-electronic 公司 safedat2 操作使用说明
  • 鸿蒙Harmony应用开发—ArkTS(@State装饰器:组件内状态)
  • 公司内部局域网怎么适用飞书?
  • Elasticsearch:让你的 Elasticsearch 索引与 Python 和 Google Cloud Platform 功能保持同步
  • 浅析ArcGis中的软件——ArcMap、ArcScene、 ArcGlobe、ArcCatalog
  • GaussDB分区表自动新增分区
  • 【Langchain-Chatchat】部署ChatGLM3-6B-32K教程
  • 微服务day05(中) -- ES索引库操作
  • Linux下安装redis
  • FL Studio2024全能数字编曲音频工作站,打造专业电音的不二之选!
  • 专业前沿问题问答合集10-2——比特币的加密原理
  • 阿里云服务器地域怎么选择?可用区是什么?
  • 「渗透笔记」致远OA A8 status.jsp 信息泄露POC批量验证
  • iOS应用审核问题解决方案及优化方法 ✨
  • 【个人向】《HTTP图解》阅后小结
  • 【刷算法】求1+2+3+...+n
  • 3.7、@ResponseBody 和 @RestController
  • Apache的基本使用
  • ES6 ...操作符
  • Flannel解读
  • JavaScript实现分页效果
  • Java应用性能调优
  • js ES6 求数组的交集,并集,还有差集
  • js如何打印object对象
  • js写一个简单的选项卡
  • laravel with 查询列表限制条数
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • React Transition Group -- Transition 组件
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Vim Clutch | 面向脚踏板编程……
  • vuex 笔记整理
  • Windows Containers 大冒险: 容器网络
  • XML已死 ?
  • 彻底搞懂浏览器Event-loop
  • 和 || 运算
  • 前端路由实现-history
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 深度学习中的信息论知识详解
  • 赢得Docker挑战最佳实践
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 进程与线程(三)——进程/线程间通信
  • ​渐进式Web应用PWA的未来
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #职场发展#其他
  • (6)STL算法之转换
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (windows2012共享文件夹和防火墙设置
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (学习日记)2024.01.09
  • (一)80c52学习之旅-起始篇
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .bat批处理(一):@echo off