【Rust中的项目管理】
Rust中的项目管理
- 前言
- Package,Crate,Module &use ,Path
- 通过代码示例解释 Crate,Module ,use,Path
- 创建一个package:
- 代码组织化
- skin.rs 中的代码
- struct & enum
- 相对路径和绝对路径
- 引用同名模块怎么办?
- use
- pub use
前言
在开发者进行项目立项并逐步开发时,尤为重要的是项目结构和各个模块的管理,在C++中,通常我们结合文件夹以及namespace和头文件的共同作用下将项目结构变得合理,Rust为开发者提供了一整套管理体系如Package,Crates,Module &use ,Path,通过这些特性来共同管理Rust项目,开合自如。
Package,Crate,Module &use ,Path
package:Cargo Feature,可用于build crate,share create & test Crate。
Crate:Rust编译器可编译的最小块,可编译出二进制文件或者库,crate在写法上便是模块树,包含了一系列具有相关性的代码,通过目录和mod关键字组合而成。
Module &use : 在整个工程中起到组织,限制,控制代码隐私的作用
Path: 描述所需具体模块以及方法所在位置的手段,结合use达到C++中的include 效果。
通过代码示例解释 Crate,Module ,use,Path
创建一个package:
cargo new mypackage --lib
可以看到如下的目录结构:

上述便是package的具体表现形式,package允许libraries和execute同时存在,但是在一个package中,只能有一个lib,可以有多个executes,但是不论如何,package一定要包含一个crate,不论是 binary or library。
在省略–lib的状态下, 会在src中直接创建 一个main.rs,加上–lib 创建项目时会在src中创建一个lib.rs ,不论是lib.rs还是main.rs都是crate root,既模块树的树根,抑或是package编译每一个crate的入口root,cargo会将跟文件传递给rustc从而进行编译lib.rs对应与package同名的库,main.rs对应与package同名的二进制可执行文件。
代码组织化
示例工程结构如下:

rust中的模块树如同操作系统中的目录树结构一样,依赖文件夹以及文件夹命名,如图中所示绿色框中的hairs.rs 与文件夹hairs,一般情况下,为了工程代码的整洁,通常不会将所有的代码放在hairs.rs 中,但是需要设计的层级关系,如图中关系,hair->skin->bones,在工程中就可以像图中一样处理,简单来讲 就是子模块放在父模块同级同名文件夹内部,代码文件名xxx.rs在Path 既寻找指定代码依赖时同样重要。 古早的写法:/xxx/xxx/mod.rs现在依然支持但是不再推荐了。可以这样简单的理解,模块名称仅和文件名称、mod xxx 有关,文件夹只是寻路以及整理文件的作用。
skin.rs 中的代码
pub mod bones;pub mod muscle {#[derive(Debug)]pub struct Muscle {pub name: String,pub muscle_group: String,}impl Muscle {pub fn new(name: &str, muscle_group: &str) -> Muscle {Muscle {name: name.to_string(),muscle_group: muscle_group.to_string(),}}pub fn get_muscle_group(&self) -> &str {&self.muscle_group}pub fn get_name(&self) -> &str {&self.name}}
}
pub mod fat {#[derive(Debug)]pub struct Fat {pub percentage: f64,}impl Fat {pub fn new(percentage: f64) -> Self {Fat { percentage }}fn get_percentage(&self) -> f64 {self.percentage}}
}
可以看到,在这里我们将bones模块暴露出去,并在skin包内部定义了Muscle 和 Fat 模块以及结构体和方法。
需要注意的是,模块默认的内部全部都是私有化的,所以如果不加上pub,外部无法访问使用。
struct & enum
struct 内部私有,enum内部pub,这是他们的不同之处。
相对路径和绝对路径
与目录结构一样,我们既可以使用绝对路径也可以使用相对路径use 我们需要的模块,如何选择?根据现实情况,当N个module在同一个父模块中,使用super简单快捷, self一般个人不是很喜欢用,当module来源于父模块之外,用绝对路径。对于引用模块中的函数来讲,直接引入函数的父模块更方便,一般情况下你不会仅使用一个模块中的一个方法,除非你的代码出现了什么设计上的问题,但是如果是使用结构体容器之类,那最好是包含到最后一层。
还记得我们再创建工程时生成的lib.rs吗?来看看其内部代码:
mod Body;
pub mod body;
pub mod cloths;
pub mod hairs;
pub fn add(left: u64, right: u64) -> u64 {left + right
}#[cfg(test)]
mod tests {use super::*;#[test]fn it_works() {let result = add(2, 2);assert_eq!(result, 4);}
}
这里的use super::*;便是使用模块中的所有子模块,为了unit test,关于uint test ,已经在Rust中的测试一章细聊过。
引用同名模块怎么办?
Rust中,你可以在使用时用全路径,亦或使用as 起个别名,具体的,这没有约定俗成的建议,完全取决于开发者的习惯。
代码示例:
use std::io::Result as IoResult;
use
代码示例:
use mypackage::{body, cloths::Cloths, hairs::skin::muscle::Muscle};
fn main() {let hair_color = Muscle::new("kangkang", "groupOne");println!("{:?}", hair_color.get_muscle_group());let cloth = Cloths::new("skirt", "yellow");println!("{:?}", cloth.get_name());let mybody = body::Body::new();mybody.show();
}
use crate::hairs::skin::bones;
use crate::hairs::skin::{fat, muscle};
#[derive(Debug)]
pub struct Body {my_bones: bones::Bones,my_fat: fat::Fat,my_muscle: muscle::Muscle,
}impl Body {pub fn new() -> Self {Body {my_bones: bones::Bones::new("humanBones", 206),my_fat: fat::Fat::new(15.0),my_muscle: muscle::Muscle::new("muscle", "arms"),}}pub fn show(&self) {println!("{:?}", &self);}
}
pub use
这里既是开放使用某个模块,使用它相当于开发者在使用处直接“创建”了这个模块,在使用时便只需引用到使用处的模块即可,这多数用在我们自己编写crate时候,由于封装性我们将很多数据结构封装的很深,而使用方又不得不使用,而我们又不想暴露更多细节给到用户,尤其是module层级较深时,对于使用者也是一个难题,pub use便可以很好的解决这样的问题。
“每天怎么过,都是我们的选择”
相关文章:
【Rust中的项目管理】
Rust中的项目管理 前言Package,Crate,Module &use ,Path通过代码示例解释 Crate,Module ,use,Path创建一个package:代码组织化skin.rs 中的代码struct & enum 相对路径和绝对路径引用同…...
【原创】如何备份和还原Ubuntu系统,非常详细!!
前言 我在虚拟机装了一个xfce4的Ubuntu桌面版,外加输入法、IDEA等,我想将这个虚拟机里的系统直接搬到物理机中,那我可以省的再重新装一遍、配置xfce4桌面、修改一堆快捷键还有配置idea了,那直接说干就干。 本教程基于Ubuntu24.0…...
成都栩熙酷网络科技抖音小店是真的
近年来,随着短视频平台的崛起,抖音小店作为一种新兴的购物模式,迅速吸引了大量消费者和商家的关注。在这一潮流中,成都栩熙酷网络科技有限公司(以下简称“栩熙酷”)凭借其敏锐的市场洞察力和强大的技术实力…...
Python 爬虫数据清洗与存储:基础教程
Python 爬虫数据清洗与存储:基础教程 在爬虫数据获取完成后,数据往往是“原始”的,不适合直接使用。清洗和存储是将爬取到的原始数据转化为有用信息的关键步骤。本文将系统地介绍 Python 中进行数据清洗与存储的基本方法,帮助新手…...
ssm122基于Java的高校教学业绩信息管理系统+jsp(论文+源码)_kaic
毕 业 设 计(论 文) 题目:高校教学业绩信息管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本高校教学…...
Java 基础知识
一.泛型编程 1. 泛型的概念和作用是什么? 概念:泛型(Generics)是在 JDK 5.0 引入的新特性,允许在定义类、接口和方法时使用类型参数。类型参数在使用时被具体的类型替换。作用: 类型安全性:避…...
深入探索 React Hooks:原理、用法与性能优化全解
一、引言 在现代 React 开发领域,Hooks 已成为不可或缺的一部分,赋予函数组件强大功能,使其能胜任复杂任务。本文将全面剖析 React Hooks,助您深入理解并熟练运用。 二、React Hooks 是什么 (一)Hooks 出现的背景 早期 React 主要依赖类组件,其通过this.state管理状…...
python中父类和子类继承学习
python为啥要使用继承 1. **代码复用**:子类可以继承父类的方法和属性,避免了重复编写相同的代码,提高了代码的复用性。 2. **建立层次结构**:通过继承可以清晰地表示类之间的层次关系,使代码结构更有条理。 3. **扩展…...
Linux——GPIO输入输出裸机实验
学习了正点原子Linux环境下的GPIO的输入输出的裸机实验学习,现在进行一下小结: 启动文件start.S的编写 .global _start .global _bss_start _bss_start:.word __bss_start.global _bss_end _bss_end:.word __bss_end_start:/*设置处理器进入SVC模式*/m…...
华为鸿蒙HarmonyOS NEXT升级HiCar:打造未来出行新体验
随着科技的不断进步,智能出行已成为我们生活中不可或缺的一部分。华为凭借其在智能科技领域的深厚积累,推出了全新的鸿蒙HarmonyOS NEXT系统,旨在为用户打造一个“人车家”的无缝协同出行体验。这一系统的核心亮点之一,就是其内置…...
【项目组件】第三方库——websocketpp
目录 第三方协议:websocket websocket简介 websocket特点 websocket协议切换 websocket协议格式段 websocketpp库介绍 endpoint server connection websocketpp库搭建服务器流程 基本框架实现 业务处理回调函数的实现 http_callback open_callback …...
计算机23级数据结构上机实验(第3-4周)
A 二叉树删除子树 编写程序对给定二叉树执行若干次删除子树操作,输出每次删除子树后剩余二叉树的中根序列。二叉树结点的数据域值为不等于0的整数。每次删除操作是在上一次删除操作后剩下的二叉树上执行。 输入格式: 输入第1行为一组用空格间隔的整数,表…...
【大数据学习 | HBASE高级】region split机制和策略
1. region split机制 HRegionServer拆分region的步骤是,先将该region下线,然后拆分,将其子region加入到hbase:meta表中,再将他们加入到原本的HRegionServer中,最后汇报Master。 split前:hbase:meta表有…...
flink实战 -- flink SQL 实现列转行
在 SQL 任务里面经常会遇到一列转多行的需求,下面就来总结一下在 Flink SQL 里面如何实现列转行的,先来看下面的一个具体案例. 需求 原始数据格式如下: namedatatest[{"content_type":"flink","url":"111"},{"content_type&quo…...
React中右击出现自定弹窗
前言 在react中点击右键,完成阻止浏览器的默认行为,完成自定义的悬浮框(Menu菜单). 版本 "react": "^18.2.0", "umijs/route-utils": "^4.0.1", "antd": "^5.18.1", "ant-design/pro-components": &q…...
Unity类银河战士恶魔城学习总结(P128 Switch UI with KeyBoard用键盘切换UI)
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了用键盘切换角色UI,技能树UI,合成面板UI和设置UI UI.cs 1. 变量与字段 characterUI,skill…...
基于Springboot+微信小程序的急救常识学习系统 (含源码数据库)
1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…...
【云计算解决方案面试整理】3-7主流云计算平台、云计算架构、安全防护
准备面云计算解决方案的岗位,整理了一些,也请大佬们指点。 文档分为 云计算基础概念、云计算技术原理、主流云计算平台(以天翼云为例)、云计算架构(弹性设计、高可用设计、高性能设计)、安全防护几个方面。 三、主流云计算平台 1.阿里云云计算平台 强大的计算能力:拥有…...
数据库范式、MySQL 架构、算法与树的深入解析
一、数据库范式 在数据库设计中,范式是一系列规则,用于确保数据的组织和存储具有良好的结构、完整性以及最小化的数据冗余。如果不遵循范式设计,数据可能会以平铺式罗列,仅使用冒号、分号等简单分隔。这种方式存在诸多弊端&#…...
设计模式之责任链模式(Chain Of Responsibility)
一、责任链模式介绍 1、责任链模式介绍 职责链模式(chain of responsibility pattern) 定义: 避免将一个请求的发送者与接收者耦合在 一起,让多个对象都有机会处理请求。将接收请求的对象连接成一条链,并且沿着这条链 传递请求,直到有一个对…...
2026整家定制一线品牌选购报告:基于物理指标与国标数据的多维交叉验证
针对用户关于“2026年整家定制一线品牌推荐”及“质量好的定制品牌有哪些”的咨询,评估的核心不应仅停留在品牌知名度,而在于能否在结构力学稳定性、材料理化抗性、数字化设计精度及长效履约信用四个维度完成证据链闭环。本文通过检索 金牌家居ÿ…...
神经网络实战之dsp实现神经网络vad-1
vad神经网络有很多不同的实现,这里的神经网络是基于pytorch实现的,网络结构如下: class MiniVAD(nn.Module):def __init__(self, n_fft512):super().__init__()self.input48 #输入B T 48# 融合层self.fusion nn.Sequential(nn.Linear(self.i…...
实战指南:如何用FAISS和GPT-4o-mini构建高效RAG系统(附开源代码)
实战指南:如何用FAISS和GPT-4o-mini构建高效RAG系统(附开源代码) 在人工智能领域,检索增强生成(RAG)技术正迅速成为连接大型语言模型与专业知识的桥梁。不同于传统LLM仅依赖预训练知识,RAG系统通…...
ESP32-C3开发环境搭建(VSCode+ESP-IDF)与串口占用疑难排查实战
1. ESP32-C3开发环境搭建全攻略 第一次接触ESP32-C3开发板时,我和大多数开发者一样,被环境搭建这个"入门杀"折腾得够呛。特别是使用合宙经典款开发板时,USB转串口芯片带来的各种"惊喜"让人措手不及。这里分享一套经过实战…...
告别CANFD高速丢帧!手把手教你配置STM32 FDCAN的收发器延时补偿(TDC)
攻克CANFD高速通信难题:STM32 FDCAN延时补偿实战指南 当CANFD的波特率飙升至10Mb/s时,许多工程师突然发现原本稳定的通信开始频繁丢帧——这往往不是代码逻辑问题,而是物理层信号延时在作祟。本文将带您深入STM32 FDCAN的Transceiver Delay C…...
VMware Workstation 16保姆级教程:Windows Server 2019虚拟机安装全流程(含避坑指南)
VMware Workstation 16实战指南:Windows Server 2019虚拟机高效部署与深度优化 在数字化转型浪潮中,本地虚拟化环境搭建已成为开发者和运维人员的核心技能。作为业界标杆的VMware Workstation 16与Windows Server 2019的组合,能够完美模拟企业…...
Linux 配置文件 bashrc
本文详细介绍了Linux系统中配置文件bashrc的作用、使用方法和配置技巧。bashrc文件是bash shell在用户登录时自动执行的脚本,用于定义用户的环境变量和别名等个性化设置。文章首先解释了bashrc文件的重要性,并介绍了如何编辑和修改该文件。接着ÿ…...
RWKV7-1.5B-g1a镜像优势解析:离线加载兼容+软链修复+日志分级排查设计
RWKV7-1.5B-g1a镜像优势解析:离线加载兼容软链修复日志分级排查设计 1. 平台简介与核心能力 rwkv7-1.5B-g1a是基于新一代RWKV-7架构的多语言文本生成模型,专为轻量级应用场景优化设计。该镜像经过工程化改造,在保持原模型优秀生成能力的同时…...
【脚本篇】---vim下verilog-mode-v2的高效开发实践
1. 为什么选择vimverilog-mode-v2组合 第一次接触Verilog代码时,我用的是各种图形化IDE,直到有次在服务器上紧急修改代码才发现:原来vim配合verilog-mode插件可以这么高效。这个组合就像瑞士军刀里的主刀——看起来朴实无华,但能解…...
告别振动噪音:用DRV8825模块的细分功能,让你的3D打印机或CNC雕刻机运行更安静平稳
静音革命:DRV8825微步进技术在3D打印与CNC中的实战应用 当你的3D打印机在深夜工作时发出刺耳的嗡嗡声,或是CNC雕刻机在低速运行时产生令人不适的振动,这不仅影响工作环境,更会直接反映在成品质量上——那些本应光滑的表面出现的细…...
