关于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() {}

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

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

相关文章

ALPHA开发板中CAN硬件图

一. 简介 前面文章学习了 IMX6ULL芯片的 CAN总线协议,CAN传输速率。 本文来搜索 ALPHA开发板中CAN硬件原理图,以及CAN设备节点信息。这里主要是CAN控制器的驱动,属于IMX6ULL芯片内部的驱动,NXP官方已经写好。 CAN控制器的驱动…

InstructGPT的流程介绍

1. Step1:SFT,Supervised Fine-Tuning,有监督微调。顾名思义,它是在有监督(有标注)数据上微调训练得到的。这里的监督数据其实就是输入Prompt,输出相应的回复,只不过这里的回复是人工…

springboot项目学习-瑞吉外卖(2)

今天主要完善以下功能: 拦截页面(页面拦截功能,在这里用的是过滤器实现的)添加员工功能 项目结构 1.页面拦截功能 filter——LoginCheckFilter类 Slf4j WebFilter(filterName "LoginCheckFilter",urlPatterns "/*") public clas…

Qt打开已有工程方法

在Qt中,对于一个已有工程如何进行打开? 1、首先打开Qt Creator 2、点击文件->打开文件或项目,找到对应文件夹下的.pro文件并打开 3、点击配置工程 这样就打开对应的Qt项目了,点击运行即可看到对应的效果 Qt开发涉及界面修饰…

01-DBA自学课-安装部署MySQL

一、安装包下载 1,登录官网 MySQL :: MySQL Downloads 2,点击社区版下载 3,找到社区服务版 4,点击“档案”Archives 就是找到历史版本; 5,选择版本进行下载 本次学习,我们使用MySQL-8.0.26版本…

IAB欧洲发布首张泛欧洲数字零售媒体能力矩阵图

2024年1月18日,互动广告署-欧洲办事处(IAB Europe)发布了首张泛欧洲数字零售媒体能力矩阵图。为媒体买家提供的新资源概述了在欧洲运营的零售商提供的现场、场外和数字店内零售媒体广告机会。 2024年1月18日,比利时布鲁塞尔,欧洲领…

实用工具推荐:适用于 TypeScript 网络爬取的常用爬虫框架与库

随着互联网的迅猛发展,网络爬虫在信息收集、数据分析等领域扮演着重要角色。而在当前的技术环境下,使用TypeScript编写网络爬虫程序成为越来越流行的选择。TypeScript作为JavaScript的超集,通过类型检查和面向对象的特性,提高了代…

NFT交易市场-后端开发

首先我们需要配置好我们的ipfs,参考官方文档 1.https://docs.ipfs.tech/install/command-line/#system-requirementshttps://docs.ipfs.tech/how-to/command-line-quick-start/#initialize-the-repository 首先新建一个文件夹 然后在终端输入npm init -y命令进行初…

【AI】发现一款运行成本较低的SelfHosting语言模型

【背景】 作为一个想构建局域网AI服务的屌丝,一直苦恼的自然是有限的资源下有没有对Spec要求低一点的SelfHosting的AI服务框架了。今天给大家介绍这款听起来有点希望,但是我也还没试验过,感兴趣的可以去尝试看看。 【介绍】 大模型生成式AI与别的技术不同,由于资源要求高…

分布式之网关介绍

一、网关简介 1、网关背景 由于微服务“各自为政的特性”使微服务的使用非常麻烦。通常公司会有一个“前台小姐姐”作为统一入口,这就是网关 2、网关作用 统一入口:为服务提供一个唯一的入口,网关起到外部和内部隔离的作用, 保…

演讲嘉宾公布 | 智能家居与会议系统专题论坛将于3月28日举办

一、智能家居与会议系统专题论坛 智能家居通过集成先进的技术和设备,为人们提供了更安全、舒适、高效、便捷且多彩的生活体验。智能会议系统它通过先进的技术手段,提高了会议效率,降低了沟通成本,提升了参会者的会议体验。对于现代…

iOS模拟器 Unable to boot the Simulator —— Ficow笔记

本文首发于 Ficow Shen’s Blog,原文地址: iOS模拟器 Unable to boot the Simulator —— Ficow笔记。 内容概览 前言终结模拟器进程命令行改权限清除模拟器缓存总结 前言 iOS模拟器和Xcode一样不靠谱,问题也不少。😂 那就有病治…

设计数据库之外部模式:数据库的应用

Chapter5:设计数据库之外部模式:数据库的应用 笔记来源:《漫画数据库》—科学出版社 设计数据库的步骤: 概念模式 概念模式(conceptual schema)是指将现实世界模型化的阶段进而,是确定数据库理论结构的阶段。 概念模…

分布式搜索引擎-DSL查询文档

分布式搜索引擎-DSL查询文档 文章目录 分布式搜索引擎-DSL查询文档1、DSL Query的分类1.1、全文检索查询1.2、精确查询1.3、地理查询1.4、复合查询1.5、Function Score Query1.6、复合查询Boolean Query 2、搜索结果处理2.1、排序2.2、分页2.3、深度分页2.4、高亮 1、DSL Query…

优化选址问题 | 基于鹈鹕算法求解基站选址问题含Matlab源码

目录 问题代码问题 鹈鹕算法(Pelican Optimization Algorithm, POA)是一种相对较新的启发式优化算法,模拟了鹈鹕鸟觅食的行为。这种算法通常用于解决复杂的优化问题,如函数优化、路径规划、调度问题等。基站选址问题通常是一个复杂的优化问题,需要考虑覆盖范围、干扰、成…

java设计模式(2)---六大原则

设计模式之六大原则 这篇博客非常有意义,希望自己能够理解的基础上,在实际开发中融入这些思想,运用里面的精髓。 先列出六大原则:单一职责原则、里氏替换原则、接口隔离原则、依赖倒置原则、迪米特原则、开闭原则。 一、单一职…

STM32 使用gcc编译介绍

文章目录 前言1. keil5下的默认编译工具链用的是哪个2. Arm编译工具链和GCC编译工具链有什么区别吗?3. Gcc交叉编译工具链的命名规范4. 怎么下载gcc-arm编译工具链参考资料 前言 我们在STM32上进行开发时,一般都是基于Keil5进行编译下载,Kei…

docker 数据卷 (二)

1,为什么使用数据卷 卷是在一个或多个容器内被选定的目录,为docker提供持久化数据或共享数据,是docker存储容器生成和使用的数据的首选机制。对卷的修改会直接生效,当提交或创建镜像时,卷不被包括在镜像中。 总结为两…

FileZilla 链接服务器提示 20 秒连接超时

FileZilla 有个默认设置是如果 20 秒没有数据的话会自动中断链接。 Command: Pass: **************** Error: Connection timed out after 20 seconds of inactivity Error: Could not connect to server修改配置 这个配置是可以修改的,修改的步骤为: …

PostgreSQL中控制文件的解析与恢复

最近遇到有人问起PG中控制文件的一些使用问题,总结了一下。 1、PG控制文件简介 1.1、存储的位置 它的路径位于: 相关信息,可以用命令pg_controldata得到: [10:41:27-postgres@centos2:/var/lib/pgsql/14/data/global]$ pg_controldata -D $PGDATA pg_control version …