Rust之包,箱和模块管理(一):包和箱

【Rust】007-包管理与模块管理 【Rust】007-包管理与模块管理文章目录【Rust】007-包管理与模块管理一、包管理器:Cargo1、简介Cargo 官方文档仓库2、项目初始化3、写一个小程序任务目标寻找合适的库添加库到我们的项目中代码实现`cargo run`运行二、模块管理1、概述2、文件作为模块第一步:创建文件 `apple.rs`第二步:创... 阅读详情

开发环境

  • Windows 10
  • Rust 1.60.0

 

  •  VS Code 1.67.2 

  项目工程

这里继续沿用上次工程rust-demo

基础概念 

当你编写大型程序时,组织你的代码将是重要的,因为在你的头脑中保持整个程序的轨迹将变得不可能。通过对相关的功能进行分组,并将代码与不同的功能分开,您将清楚在哪里可以找到实现特定功能的代码,以及在哪里可以更改功能的工作方式。 

到目前为止,我们编写的程序都在一个文件的一个模块中。随着项目的增长,您可以通过将代码分成多个模块和多个文件来组织代码。一个包可以包含多个二进制板条箱和一个可选的库板条箱。随着包的增长,您可以将部件提取到独立的板条箱中,成为外部依赖项。本章涵盖了所有这些技术。对于由一组相互关联的包组成的非常大的项目,Cargo提供了工作空间。

除了对功能进行分组之外,封装实现细节还可以让您在更高的层次上重用代码:一旦实现了一个操作,其他代码就可以通过代码的公共接口调用该代码,而无需知道实现是如何工作的。您编写代码的方式定义了哪些部分是公共的供其他代码使用,哪些部分是私有的实现细节,您保留更改这些细节的权利。这是限制你必须记住的细节数量的另一种方法。

一个相关的概念是范围:编写代码的嵌套上下文有一组被定义为“在范围内”的名称在读取、编写和编译代码时,程序员和编译器需要知道特定位置的特定名称是否引用了变量、函数、结构、枚举、模块、常量或其他项,以及该项的含义。您可以创建范围并更改范围内或范围外的名称。在同一范围内不能有两个同名的项目;有解决名称冲突的工具。

Rust有许多特性允许你管理你的代码的组织,包括哪些细节是公开的,哪些细节是私有的,以及在你的程序中的每个作用域中有什么名字。这些功能有时统称为module system,包括:

  • Package(包):一个Cargo功能,让您建立,测试,和共享箱
  • Crates(箱):生成库或可执行文件的模块树
  • Modules(模块)和use:让您控制路径的组织、范围和隐私
  • Paths(路径):一种命名项目的方式,如结构、函数或模块

Package(包) & Crates(箱)

我们将介绍的模块系统的第一部分是Package和Crates。

Package是提供一组功能的一个或多个Crates。一个Package包含一个Cargo.toml文件,该文件描述了如何构建这些Crates。

Crates可以是二进制的Crates或库Crates。二进制Crates是可以编译成可运行的可执行文件的程序,例如命令行程序或服务器。它们必须有一个名为main的函数来定义可执行文件运行时发生的事情。到目前为止,我们创建的所有Crates都是二进制的Crates。

库Crates没有主函数,也不会编译成可执行文件。它们定义了多个项目共享的功能。例如,我们在前面章节中使用的rand crate提供了生成随机数的功能。

crate root是一个源文件,Rust编译器从它开始,并构成了crate的根模块。

几个规则决定了一个package可以包含什么。一个package最多可以包含一个库crate。它可以包含任意数量的二进制crate,但必须至少包含一个crate(库或二进制文件)。 

让我们看一下当我们创建一个package时会发生什么。首先,我们输入命令cargo new:

$ cargo new my-project       // 创建工程
     Created binary (application) `my-project` package
$ ls my-project               // 查看工程
Cargo.toml
src
$ ls my-project/src           // 查看目录
main.rs

当我们输入命令时,cargo创建了一个cargo.toml文件,给了我们一个package。查看cargo.toml的内容,没有提到src/main.rs,因为cargo遵循一个约定,src/main.rs是与package同名的二进制crate的crate根。同样,cargo知道如果包目录包含src/lib.rs,那么package包含一个与package同名的库crate,src/lib.rs是它的crate root。cargo将板条箱根文件传递给rustc来构建库或二进制文件。 

这里,我们有一个只包含src/main.rs的package,这意味着它只包含一个名为my-project的二进制文件。如果一个package包含src/main.rs和src/lib.rs,那么它有两个crate :一个二进制文件和一个库,两者的名称都与package的名称相同。通过将文件放在src/bin目录中,一个package可以有多个二进制crate :每个文件将是一个单独的二进制crate。

本章重点

  • Package(包)的概念
  • Crate(箱)的概念
【Rust模块管理】Rust包、crate与模块管理 包:Cargo的一个功能,允许构建,测试,和分享crate。 crate:一个模块的树形结构,形成库或二进制项目。 模块:通过use来使用,用来控制作用域和路径的私有性。 路径:一个命名 例如结构体、函数或模块等项的方式 在 Rust 中,模块(module)是组织代码的基础单位,它帮助你将代码划分为多个逻辑部分,便于管理、复用和控制访问权限。 模块是一个命名空间,用于组织函数、结构体、枚举、常量、trait 和其他模块。Rust 中的模块可以嵌套,并且支持私有和公开访问控制。 阅读详情

相关推荐

11、Rust 中的包、箱和模块详解

本文详细解析了 Rust 编程语言中的包、箱和模块系统,介绍了如何通过模块组织代码、控制作用域和隐私权限,以及使用路径引用模块中的项目。文章还通过具体示例展示了模块系统的应用场景,并总结了其优势与注意事项,帮助开发者更好地理解和运用 Rust 的模块机制。

a3b4c5的博客 99

Rust——包管理

这篇文章将介绍Rust如何进行包管理。保姆级教程。

JAN6055的博客 3687

【Rust指南】组织管理|路径表示|访问权限

为了方便大家学习掌握Rust 语言的语法和概念,因此我将带来一篇Rust 组织管理的内容。任何一门编程语言如果不能组织代码都是难以深入的,几乎没有一个软件产品是由一个源文件编译而成的。包、箱、模块。对于一个软件工程来说,我们往往按照所使用的编程语言的组织规范来进行组织,组织模块的主要结构往往是树。Java 组织功能模块的主要单位是类,而 JavaScript 组织模块的主要方式是function。这些先进的语言的组织单位可以层层包含,就像文件系统的目录结构一样。Rust 中的组织单位是模块...

叶落秋白的博客 2469

如何理解rust的箱、包、模块之间使用关系?

用一个实际的项目结构来解释 Rust 中箱(Crate)、包(Package)和模块(Module)之间的关系。必须至少包含一个箱(库箱或二进制箱)src/main.rs 定义二进制箱。src/lib.rs 定义库箱。使用 mod 关键字声明模块。使用 pub 关键字公开模块。箱是模块的树形结构的根节点。一个包可以包含多个箱。

优快云 上留心得,愿与诸君共步攀。 409

在Rviz仿真环境中搭建传送带

<geometry><material>

qq_58268456的博客 936

(精读)揭示多元时间序列的高阶组织

时间序列分析已经被证明是刻画生物学、神经科学和经济学中的一些现象以及理解它们的一些潜在动力学特征的有力方法。尽管针对多元时间序列的分析已经提出了很多方法,但大多数方法都忽略了非成对相互作用对涌现动力学的影响。在这里,我们提出了一个新的框架来刻画多元时间序列中高阶依赖关系的时间演化。利用网络分析和拓扑学,我们表明,与传统的基于成对统计的工具不同,我们的框架鲁棒地区分了耦合混沌映射的各种时空状态,包括混沌动力学阶段和各种类型的同步。

weixin_53406075的博客 2412

Rust包管理 Crate

包和crate 通过相关功能进行分组和划分不同的功能代码, 将代码分割成多个模块和多个文件组织代码, 一个包包含 多个crate 和一个可选的crate, Cargo 类似C++ 提供一个工作空间命名 类似JAVA中包空间。 避免重复造轮子, 其他代码通过公关接口进行调用。 模块系统: 包,Crates(模块树形结构,库和二进制项目), 模块, 路径。 *crate 是一个二进制项/ 库, rust编译以crate root源文件为起点,包中包含一个Cargo.toml 描述如何构建crate. $ c

上后谈感情的博客 1072

保姆级教程:用YOLOv8/9/10搞定仪表盘指针识别,附完整数据集和Python环境配置

本文提供了一份基于YOLOv8/v9/v10的仪表盘指针检测全流程指南,涵盖环境配置、数据集构建、模型选型、训练调优和部署落地等关键步骤。通过详细的代码示例和实战经验,帮助开发者高效解决工业视觉中的仪表盘检测难题,特别适合电力巡检、智能监控等应用场景。

weixin_29031057的博客 1335

掌握Cargo与Rust包管理:轻松发布与依赖控制

本文介绍了Rust语言的包管理工具Cargo,重点讲解了Cargo.toml配置文件的使用,包括包元数据、依赖管理和发布包的过程。通过实战案例和技巧,我们学会了如何创建Web服务器和使用Cargo的特性标志。最后,强调了Cargo的自动化和易用性,以及它在Rust开发中的重要性。

silenceallat的博客 1608

NXP MCU CAN波特率(位时间)配置详解

1. 概述 本文将会详细讲解如何设置NXP MCU的CAN波特率、位时间、采样点等属性。 波特率即CAN总线传输频率,位时间是波特率的倒数,例如波特率是500K,那么位时间 = 1 / 500000 = 0.000002s = 2000ns。 我们先来看一下S32K144单片机的EB中与CAN总线波特率相关的可配置参数有哪些: ...

weixin_42967006的博客 9691

Langfuse落地教程:从Docker部署到项目接入,掌控LLM调用链路

大模型应用开发中,调用链路的透明度直接决定调试效率与成本控制。可观测性技术通过记录每次请求的输入、输出、模型参数与Token消耗,帮助开发者快速定位问题。Langfuse作为开源LLM可观测性平台,将Trace、Prompt版本管理、评分等能力集成于一体,支持Docker Compose自托管部署,并提供Python/JS SDK与REST API。借助部署后的控制台,团队能够直观追踪RAG检索、Agent工具调用等复杂流程中的每一步耗时与资源占用,实现从黑盒调用到全链路可视化的转变。无论是本地调试、线上排

weixin_29698641的博客 308

Rust组织管理,箱Crate包Package和模块module定义和区别,use关键字作用

这里有两个 govern 函数,一个是 nation 下的,一个是 government 下的,我们用 as 将 nation 下的取别名 nation_govern。使用过 Java 的开发者在编程时往往非常讨厌最外层的 class 块——它的名字与文件名一模一样,因为它就表示文件容器,尽管它很繁琐但我们不得不写一遍来强调"这个类是文件所包含的类"。Rust 中的组织单位是模块(Module)。所有的系统库模块都是被默认导入的,所以在使用的时候只需要使用 use 关键字简化路径就可以方便的使用了。

1562

IoTDB时序数据库在Windows下的保姆级安装教程(含环境变量配置避坑指南)

本文提供Apache IoTDB时序数据库在Windows系统下的详细安装与配置指南。教程涵盖从Java环境检查、软件下载解压,到环境变量配置的深度避坑,并详解了服务的启动、停止、连接测试及基础数据操作,帮助物联网开发者在Windows平台快速搭建稳定的时序数据库环境。

weixin_29275257的博客 261

30天拿下Rust之箱、包和模块

Rust语言使用模块系统来组织工程和代码。模块系统允许我们将相关的函数、类型、常量等组织在一起,形成一个逻辑上的单元。通过模块系统,我们可以隐藏实现细节,只暴露必要的接口,从而提高代码的可读性和可维护性。Rust的模块系统还支持路径依赖和重导出等功能,使得代码的组织更加灵活和方便。Rust的模块系统中有三个非常重要的概念,分别是:箱(Crate)、包(Package)和模块(Module),下面逐一进行介绍。

hope_wisdom的技术博客 2123

SEG-Y 数据介绍及读写

无

1万+

SAP各模块表清单及逻辑关系介绍

分享韩国同行总结的各模块的表清单及逻辑关系,这对ABAP顾问和各模块业务顾问应该非常有用的 物料主数据 SD与MM PS模块 PP模块 QM模块 CO模块 FI模块

weixin_40672823的博客 9599

趣味学RUST基础篇(管理包和模块)

概念类比作用mod建房间划分代码区域路径门牌号定位某个函数或结构体pub开门按钮决定是否对外开放use快捷方式简化对常用项的调用模块树大楼平面图展示所有模块的层级关系。

编码浪子的专栏 951

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

rust学习之包和模块

对于 Rust 而言,包是一个独立的可编译单元,它编译后会生成一个可执行文件或者一个库。模块可见性不代表模块内部项的可见性,模块的可见性仅仅是允许其它模块去引用它,但是想要引用它内部的项,还得继续将对应的项标记为。使用模块,我们就能将功能相关的代码组织到一起,然后通过一个模块名称来说明这些代码为何被组织在一起。目录下,每一个文件都是独立的二进制包,同时也会包含一个库包,该包只能存在一个。Rust 出于安全的考虑,默认情况下,所有的类型都是私有化的,文件,包根文件中的三个模块分别形成了模块树的剩余部分。

2301_79967122的博客 2452

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

通过包和模块来组织Rust项目

Rust是一种现代的系统编程语言,具有高效性、安全性和并发性等特点。它的构建系统和包管理系统通过Cargo工具提供支持,帮助开发者管理项目、工作空间、包和模块。下面详细介绍Rust中的相关概念及其用法。

yang1fei2的博客 1623

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Rust编程-包、模块、单元包

1. 包可以类比前端工程2. 单元包分为二进制单元包和库单元包。二进制单元包就是开发当前业务系统;库单元包是为了开发组件库(类比npm组件)。1. 模块的作用主要是功能相关的代码分组到一起2. 条目是模块的组成部分,包含变量、结构体、枚举、子节点等3. 路径是访问条目的路径。是条目在模块树的节点的路径。文章引字《Rust权威指南》一书。通过整理让概念和知识点更加条理清晰。本章都是概念知识很简单,但是需要把知识点梳理清楚。

Mercuryyjs的博客 1554

Rust包、crate与模块管理

Rust的包、crate和模块管理机制提供了一种强大而灵活的方式来组织和管理代码。通过Cargo工具,开发者可以轻松地处理依赖关系、编译代码和发布包。理解这些概念对于有效地编写和维护Rust项目至关重要。

owolai的博客 1437

Rust之包,箱和模块管理(五):将模块分成不同的文件

Rust之包,箱和模块管理(五):将模块分成不同的文件

wing的专栏 1723

Rust 组织管理

任何一门编程语言如果不能组织代码都是难以深入的,几乎没有一个软件产品是由一个源文件编译而成的。本教程到目前为止所有的程序都是在一个文件中编写的,主要是为了方便学习 Rust 语言的语法和概念。对于一个工程来讲,组织代码是十分重要的。Rust 中有三个重要的组织概念:箱、包、模块。

m0_65541699的博客 1875

Rust之包,箱和模块管理(四):用use关键字引用其他包

Rust之包,箱和模块管理(四):用use关键字引用其他包

wing的专栏 4045
上一篇: Rust之枚举和模式匹配(三):简明控制流if let
下一篇: Rust之包,箱和模块管理(二):定义控制范围和隐私的模块
枫★曦
博客等级 码龄19年 251粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值