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

rust关于项目结构包,Crate和mod和目录的组织

rust

最近开始学习rust语言。感觉这门语言相对java确实是难上很多。开几个文章把遇到的问题记录一下

rust关于包,Crate

关于包,Crate这块先看看官方书籍怎么说的

crate 是 Rust 在编译时最小的代码单位。如果你用 rustc 而不是 cargo 来编译一个文件(第一章我们这么做过),编译器还是会将那个文件认作一个 crate。crate 可以包含模块,模块可以定义在其他文件,然后和 crate 一起编译,我们会在接下来的章节中遇到。

crate 有两种形式:二进制项和库。二进制项 可以被编译为可执行程序,比如一个命令行程序或者一个服务器。它们必须有一个 main 函数来定义当程序被执行的时候所需要做的事情。目前我们所创建的 crate 都是二进制项。

库 并没有 main 函数,它们也不会编译为可执行程序,它们提供一些诸如函数之类的东西,使其他项目也能使用这些东西。比如 第二章 的 rand crate 就提供了生成随机数的东西。大多数时间 Rustaceans 说的 crate 指的都是库,这与其他编程语言中 library 概念一致。

crate root 是一个源文件,Rust 编译器以它为起始点,并构成你的 crate 的根模块(我们将在 “定义模块来控制作用域与私有性” 一节深入解读)。

包(package)是提供一系列功能的一个或者多个 crate。一个包会包含一个 Cargo.toml 文件,阐述如何去构建这些 crate。Cargo 就是一个包含构建你代码的二进制项的包。Cargo 也包含这些二进制项所依赖的库。其他项目也能用 Cargo 库来实现与 Cargo 命令行程序一样的逻辑。包中可以包含至多一个库 crate(library crate)。包中可以包含任意多个二进制 crate(binary crate),但是必须至少包含一个 crate(无论是库的还是二进制的)

这里我个人理解包类似于java当中maven当中的模块,crate root 是一个源文件,Rust 编译器以它为起始点,并构成你的 crate 的根模块。就是说各个mod串联的起点,比如main.rs当中定义。或者lib.rs库create

mod

先看看官方教程

这里我们提供一个简单的参考,用来解释模块、路径、use关键词和pub关键词如何在编译器中工作,以及大部分开发者如何组织他们的代码。我们将在本章节中举例说明每条规则,不过这是一个解释模块工作方式的良好参考。

从 crate 根节点开始: 当编译一个 crate, 编译器首先在 crate 根文件(通常,对于一个库 crate 而言是src/lib.rs,对于一个二进制 crate 而言是src/main.rs)中寻找需要被编译的代码。

声明模块: 在 crate 根文件中,你可以声明一个新模块;比如,你用mod garden声明了一个叫做garden的模块。编译器会在下列路径中寻找模块代码:

内联,在大括号中,当mod garden后方不是一个分号而是一个大括号 ,在文件 src/garden.rs,在文件 src/garden/mod.rs

声明子模块: 在除了 crate 根节点以外的其他文件中,你可以定义子模块。比如,你可能在src/garden.rs中定义了mod vegetables;。编译器会在以父模块命名的目录中寻找子模块代码:内联,在大括号中,当mod vegetables后方不是一个分号而是一个大括号

在文件 src/garden/vegetables.rs

在文件 src/garden/vegetables/mod.rs

模块中的代码路径: 一旦一个模块是你 crate 的一部分,你可以在隐私规则允许的前提下,从同一个 crate 内的任意地方,通过代码路径引用该模块的代码。举例而言,一个 garden vegetables 模块下的Asparagus类型可以在crate::garden::vegetables::Asparagus被找到。

私有 vs 公用: 一个模块里的代码默认对其父模块私有。为了使一个模块公用,应当在声明时使用pub mod替代mod。为了使一个公用模块内部的成员公用,应当在声明前使用pub。

use 关键字: 在一个作用域内,use关键字创建了一个成员的快捷方式,用来减少长路径的重复。在任何可以引用crate::garden::vegetables::Asparagus的作用域,你可以通过 use crate::garden::vegetables::Asparagus;创建一个快捷方式,然后你就可以在作用域中只写Asparagus来使用该类型。

这里我个人理解就像是java当中的package,当然也有很大区别。通过这些能组织项目中的目录,各个package引用

举个例子,用mvc层架构controller包举例

想创建controller目录,首先再main.rs或者lib.rs当中声明mod,这里用main.rs举例

pub mod controller;fn main() {println!("hello world!");
}

然后就可以创建controller目录了,并创建对应的mod.js
在这里插入图片描述
下面再controller目录下创建别的rs文件可以这么做,比如创建user模块的。
在controller/mod.rs当中声明user mod

pub mod user;

然后就可以在controller目录下创建user.rs mod了
最终下来简单结构如图
在这里插入图片描述
后续可以按照此方法创建单package下的代码结构了。
文章算是记录遇到的问题。如有不对的地方欢迎指正

相关文章:

rust关于项目结构包,Crate和mod和目录的组织

rust 最近开始学习rust语言。感觉这门语言相对java确实是难上很多。开几个文章把遇到的问题记录一下 rust关于包,Crate 关于包,Crate这块先看看官方书籍怎么说的 crate 是 Rust 在编译时最小的代码单位。如果你用 rustc 而不是 cargo 来编译一个文件…...

如何微调优化你的ChatGPT提示来提高对话质量

ChatGPT会话质量很大程度上取决于微调优化提示的艺术。本文旨在阐明微调提示的复杂性,以确保你可以充分发挥ChaGPT这一颠覆性工具的潜力。 与ChatGPT对话的关键部分是“提示”。即:你输入的问题或陈述,它决定了人工智能的响应。类似于引导对…...

微信小程序实现下拉刷新

一、设置微信小程序所有页面都可以下拉刷新 1、在app.json的"window"中进行配置 (1)把"backgroundTextStyle":“light"改为"backgroundTextStyle”:“dark” (2)添加"enablePullDownRefresh…...

一、编程规约

一、编程规约 (一)命名风格 不以下划线(_)或美元符号($)开始和结束不用中文拼音避免歧视或侮辱性词语类名用UpperCamelCase风格,以下情况例外:DO/PO/DTO等方法名、参数名、成员变量、局部变量使用lowerCam…...

pytest数据驱动 pandas

pytest数据驱动 pandas 主要过程:用pandas读取excel里面的数据,然后进行百度查询,并断言 pf pd.read_excel(data_py.xlsx, usecols[1,2])print(pf.values)输出:[[‘听妈妈的话’ ‘周杰伦’] [‘遇见’ ‘孙燕姿’] [‘伤心太平…...

Modbus工业RFID设备在自动化生产线中的应用

传统半自动化生产线在运作的过程,因为技工的熟练程度,专业素养的不同,在制造过程中过多的人为干预,工厂将很难对每条生产线的产能进行标准化管理和优化。如果半自动化生产线系统是通过前道工序的作业结果和检测结果来决定产品在下…...

见证马斯克的钞能力,AI.com再次易主,OpenAI投掷1100万美金购买AI.com刚满五个月

我们又一次见证了马斯克的钞能力。上次是去年他用440亿美元买下推特。 高价值的AI.com域名在2021年易主后,闲置过一段时间,今年2月份突然重定向到ChatGPT。 对于ChatGPT用户来说,每次访问都要在浏览器里敲这些字符:https://chat.o…...

linux vi/vim

目录 什么是 vim?vi/vim的使用命令模式输入模式底线命令模式工作模式总结 vi/vim按键说明一般模式可用的光标移动、复制粘贴、搜索替换等移动光标搜索替换删除、复制与粘贴 指令行模式可用的按钮储存、离开等指令vim 环境的变更 所有的 Unix Like 系统都会内建 vi 文…...

算法与数据结构-哈希算法

文章目录 什么是哈希算法哈希算法的应用安全加密唯一标识数据校验散列函数负载均衡数据分片分布式存储 一致性哈希算法 什么是哈希算法 哈希算法的定义和原理非常简单,基本上一句话就可以概括了。将任意长度的二进制值串映射为固定长度的二进制值串,这个…...

企业做直播时如何选择适合自己的直播平台?

企业做直播时如何选择适合自己的直播平台? 可以通过对比不同直播平台的技术能力、服务质量、安全性等方面的内容,选择最适合自己的直播平台。 企业做直播如何选择直播平台 我的文章推荐: [视频图文] 线上研讨会是什么,企业对内对…...

【JavaWeb】实训的长篇笔记(下)

文章目录 八、功能实现1、注册功能2、登录功能3、问题说明4、首页数据显示5、后台管理 八、功能实现 1、注册功能 jsp:能够在页面中把数据动态化,jsp和html在元素标签上是无区别的,区别是html中写上java代码就成了jsp文件。filename.jsp。 需…...

linux bash快捷键

1、^abc-^-123: 这个命令用于运行上一个命令,并将其中的"abc"替换为"123"。 示例:如果上一个命令是echo abc,则运行^abc-^-123后会执行命令echo 123。 2、!!: 这个命令用于重复执行上一条命令。 示例:如果上…...

KCC@广州开源读书会广州开源建设讨论会

亲爱的开源读书会朋友们, 在下个周末我们将举办一场令人激动的线下读书会,探讨两本引人入胜的新书《只是为了好玩》和《开源之迷》。作为一个致力于推广开源精神和技术创新的社区,这次我们还邀请了圈内大咖前来参与,会给大家提供一…...

搜文本搜位置搜图片,1小时玩转阿里云 Elasticsearch

作者:朱杰、奚悦、黄宇 AI 和搜索的整合已成为下一代搜索引擎的发展趋势,技术革新的浪潮下,你是否想抓住搜索领域的新机会,增强 AI 产品力与技术竞争力? 想学习搜索引擎技术的你,是否面临这样的困惑&…...

从三个主要需求市场分析,VR全景创业的潜力发展

VR全景,5G时代朝阳产业,其实拍摄制作很简单,就是利用一套专业的相机设备去给商家拍摄,结合后期专业的3DVR全景展示拍摄制作平台,打造3D立体环绕的效果,将线下商家真实环境1:1还原到线上&#xf…...

k8s 自身原理 2

前面我们说到 K8S 的基本原理和涉及的四大组件,分享了前两个组件 etcd 和 ApiServer 这一次我们接着分享一波: 调度器 scheduler控制器管理器 controller manager 调度器 scheduler 调度器,见名知意,用于调度 k8s 资源的&…...

解决hbase节点已下线,但在status中显示为dead问题

工作中需要下线4台hbase小节点,下线完成后使用status 命令查看,有一台为dead状态: 使用status detailed 查看,发现“hd-03"这台节点是dead。 检查各节点配置文件无误,并使用 /opt/hbase/bin/hbase-daemon.sh restart master 重启两个…...

深入理解Python装饰器:解析高阶函数与代码美学

文章目录 🍀引言🍀什么是装饰器?🍀装饰器的基本用法🍀带参数的装饰器🍀类装饰器🍀总结 🍀引言 当谈到Python编程中的高级特性时,装饰器(decorators&#xff0…...

构建之法 - 软件工程实践教学:每天都向前推进一点点

作者:福州⼤学 汪璟玢⽼师 汪老师:每次都向前推进一点点,哪怕只有一点点,也好过什么都不做。 ​邹老师:对,几个学期下来,就已经超过那些“空想”的团队很远了。坚持下去! 汪老师&…...

CSS transform:rotate;无效问题

CSS设置旋转 transform:rotate无效。 今天遇到一个奇怪的问题,CSS给 icon图标设置一个hover 旋转180deg的效果,不生效。 一度任务样式被覆盖了,样式不生效没选中元素的class。但是设置hover改变大小是生效的。奇怪了? 为什么会无…...

Avalonia实战:5分钟搞定无边框窗口自定义(附拖拽功能完整代码)

Avalonia实战:5分钟实现无边框窗口与拖拽功能全解析 第一次接触Avalonia的无边框窗口时,我花了整整一天时间才搞明白各种属性的作用。现在回想起来,如果能有一篇直击要点的指南,至少能节省80%的调试时间。本文将带你快速掌握两种取…...

TypeScript 快速实战系列:基础入门|TypeScript 核心语法 1 小时吃透(必备基础)

🔥 导读:上一篇我们搞定了TS环境搭建,也搞懂了为什么大模型开发必须学TS。今天这篇,不搞复杂理论,只讲大模型开发中「最常用、最核心」的TS语法——基础类型类型注解,1小时就能吃透,学完就能给大…...

手把手教你用STM32CubeMX和HAL库驱动DW3000:从SPI配置到第一个测距Demo

零基础玩转DW3000:STM32CubeMXHAL库实现厘米级UWB测距全指南 当我们需要在仓库里快速定位某个货架上的商品,或是让扫地机器人精准识别家具位置时,传统GPS和蓝牙方案的精度往往捉襟见肘。这正是UWB(超宽带)技术大显身手…...

微服务七大核心组件详解:搞懂架构运行底层逻辑

从实战视角拆解微服务架构的"五脏六腑",掌握每个组件的设计哲学与落地细节一、为什么需要这七大组件? 微服务架构的本质是分布式系统的工程化实践。当单体应用拆分为数十个甚至上百个独立服务后,我们面临的核心挑战:挑战…...

火电行业低成本私有化 RAG 部署

全球 AI 算力市场正处于一场看不见的“围城”之中。 当苹果被曝出为了备战 iOS 18 的 AI 功能,疯狂扫货数千台 NVLX H100 GPU 集群,导致全球高端算力卡供货周期延长至 52 周以上时,对于传统重资产运营的行业——如火电企业——而言&#xff…...

JAVA重点基础、进阶知识及易错点总结(34)注解基础(Annotation)

🚀 Java 巩固进阶 第 34 天 主题:注解基础(Annotation)—— 代码的"元数据"标签📅 进度概览:继设计模式之后,今天学习 Java 注解体系。注解是"代码的标签",是 …...

Linux依赖冲突实战:deepin-wine疑难杂症排查指南

1. 当deepin-wine遇上依赖地狱:报错现场还原 第一次在Ubuntu上安装deepin-wine时,那个满屏飘红的依赖错误让我至今记忆犹新。终端里不断刷新的"但是它将不会被安装"提示,像极了游戏里的连环陷阱。这类问题通常发生在混合安装32位/6…...

Anaconda误删预防体系建设:自动化备份脚本与版本控制策略题

Anaconda误删预防体系建设:自动化备份脚本与版本控制策略题 昨天实验室又出事了。同事在清理服务器时顺手把整个/opt/anaconda3给删了,理由是“看着像临时文件夹”。三个项目的环境全挂,依赖冲突排查到半夜。这种剧情每隔几个月就上演一次&am…...

2025届学术党必备的六大降AI率方案实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 面向维普系统针对人工智能生成内容的识别机制,要降低AI检测率就得采取系统化策略…...

贾子科学定理(Kucius Science Theorem):确立确证性原则的科学判定新范式

贾子科学定理(Kucius Science Theorem):确立确证性原则的科学判定新范式摘要贾子科学定理由学者贾子邓于2026年提出,基于东方智慧与系统科学,确立四大核心定律:真理硬度定律(科学即特定边界内永…...