Rust之包,箱和模块管理(二):定义控制范围和隐私的模块

SAR ADC和sigma delta ADC的区别 0、ADC基本概念 ADC,即analog to digital converter,模拟到数字的转换器,简称模数转换器。 为什么需要ADC?因为现实的世界中,电信号是连续的,例如心电信号,或者声音信号,这些连续的信号被称为“模拟信号”。 图1:心电信号 图2:声音信号 然而这种连续的信号是无法被计算机处理的,计算机只认识0和1组成的“数字信号“。ADC就充当了这样一个桥梁,将“模拟信号”转换为计算机能识别的“数字信号”。举个例子,当前的心电电压为1.2V(实际没有这么高),ADC可能会得 阅读详情

开发环境

  • Windows 10
  • Rust 1.61.0

 

  •  VS Code 1.68.1 

   项目工程

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

定义控制范围和隐私的模块

在这一节中,我们将讨论模块和模块系统的其他部分,即允许您命名项目的路径paths;将路径带入范围的use关键字;和pub关键字来公开项目。我们还将讨论as关键字、外部包和glob操作符。

首先,我们将从一个规则列表开始,以便在您将来组织代码时参考。然后我们将详细解释每一个规则。

模块快速参考

下面是模块、路径、use关键字和pub关键字在编译器中的工作方式,以及大多数开发人员如何组织他们的代码。我们将浏览每一个规则的例子,但是这是一个很好的地方来回顾模块是如何工作的。

  • 从箱(crate)根开始:编译一箱crate时,编译器首先查看板条箱根文件(通常对于库箱crate是src/lib.rs,对于二进制箱crate是src/main.rs)。
  • 声明模块:在箱crate根文件中,你可以用mod garden声明一个名为“garden”的新模块;。编译器将在以下位置查找模块内部的代码:
    • 内联,直接跟在mod garden后面,在花括号内而不是分号内
    • 在src/garden.rs文件中
    • 在src/garden/mod.rs文件中
  • 声明子模块:在除了作为箱crate一部分编译的箱crate根目录之外的任何文件中(例如,src/garden.rs),您可以声明子模块(例如,mod vegetables).编译器将在以父模块命名的目录中的以下位置查找子模块中的代码:
    • 内联,直接跟在mod vegetables后面,在花括号内,而不是分号内
    • 在src/garden/vegetables.rs文件中
    • 在src/garden/vegetables.rs文件中
  • 模块中代码的路径:一旦一个模块被编译成你的箱crate的一部分,只要隐私规则允许,你就可以从这个箱crate中的任何地方通过使用路径crate::garden::vegetables::Asparagus来引用那个模块中的代码(例如,garden vegetables模块中的一个Asparagus类型)。
  • 私有与公共:默认情况下,模块中的代码相对于其父模块是私有的。要使一个模块成为公共的,用pub mod而不是mod声明它。要使公共模块中的项也成为公共的,请在声明前使用pub。
  • use关键字:在一个范围内,use关键字创建项目的快捷方式,以减少长路径的重复。在任何可以引用crate::garden::vegetables::Asparagus的作用域中,都可以使用use crate::garden::vegetables::Asparagus创建快捷方式;然后只需编写Asparagus,就可以在作用域中使用该类型。

这里有一个名为“backyard ”的二进制箱crate来说明这些规则。箱crate的目录,也称为backyard ,包含这些文件和目录:

backyard                   // 目录结构
├── Cargo.lock
├── Cargo.toml
└── src
    ├── garden
    │   └── vegetables.rs
    ├── garden.rs
    └── main.rs

箱crate的根文件,在本例中为src/main.rs,包含:

文件名:src/main.rs

use crate::garden::vegetables::Asparagus;   // use关键字

pub mod garden;               // pub关键字声明模块garden

fn main() {
    let plant = Asparagus {};
    println!("I'm growing {:?}!", plant);
}

pub mod garden:意味着编译器包含它在src/garden.rs中找到的代码,即:

文件名:src/garden.rs

pub mod vegetables;        // 声明模块vegetables是公共的

pub mod vegetables:表示src/garden/vegetables.rs中的代码也包括在内:

#[derive(Debug)]
pub struct Asparagus {}

将相关代码分组到模块中

模块让我们将一个箱crate中的代码组织成组,以便于阅读和重用。模块还控制项目的隐私,即项目是否可以由外部代码使用(public)或者是内部实现细节而不能供外部使用(private)。

举个例子,让我们写一个提供餐馆功能的图书馆箱crate。我们将定义函数的签名,但将它们的主体留空,以便专注于代码的组织,而不是用代码实际实现一个餐馆。

在餐饮业中,餐馆的一些部分被称为前厅,另一些被称为后厅。房子的前面是顾客所在的地方;这里是主人招待顾客、服务员接受订单和付款、调酒师调酒的地方。房子的后面是厨师和厨师在厨房工作的地方,洗碗工打扫卫生,经理做行政工作。

为了像真正的餐馆一样构建我们的箱crate,我们可以将功能组织成嵌套的模块。通过运行cargo new - lib restaurant创建一个名为restaurant的新库;然后把下述的代码放到src/lib.rs中,定义一些模块和函数签名。

文件名: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() {}
    }
}

我们通过以mod关键字开始定义一个模块,然后指定模块的名称(在本例中是front_of_house ),并在模块体周围放置花括号。在模块内部,我们可以有其他模块,就像在这个例子中的模块hosting和serving。模块也可以保存其他项目的定义,比如结构、枚举、常量、特征或者——如上例所示——函数。

通过使用模块,我们可以将相关的定义组合在一起,并命名它们为什么相关。使用这种代码的程序员将更容易找到他们想要使用的定义,因为他们可以根据组来导航代码,而不必通读所有的定义。向代码中添加新功能的程序员会知道将代码放在哪里以保持程序有条理。

前面我们提到src/main.rs和src/lib.rs称为箱crate根。之所以有这样的名字,是因为这两个文件中的任何一个文件的内容在crate的模块结构的根上形成了一个名为crate的模块,称为模块树。

下面显示了上例中结构的模块树。

crate
 └── front_of_house
     ├── hosting
     │   ├── add_to_waitlist
     │   └── seat_at_table
     └── serving
         ├── take_order
         ├── serve_order
         └── take_payment

这个树显示了一些模块如何嵌套在另一个模块中(例如,在front_of_house中有hosting嵌套)。该树还显示了一些模块是彼此的兄弟,这意味着它们是在同一个模块中定义的(hosting和serving是在front_of_house中定义的)。继续家族隐喻,如果模块A包含在模块B中,我们说模块A是模块B的子模块,模块B是模块A的父模块。注意,整个模块树的根在名为crate的隐式模块下。

模块树可能会提醒您计算机上文件系统的目录树;这是一个非常贴切的比喻!就像文件系统中的目录一样,您使用模块来组织您的代码。就像目录中的文件一样,我们需要一种方法来找到我们的模块。

本章重点

  • 模块的概念
  • 模块的声明
  • mod关键字
  • use关键字
  • pub关键字
  • 模块树
万字长文,YOLOv8 yaml 文件解析 | 一文搞定 YOLOv8 分类任务,检测任务,分割任务,关键点任务 YOLOv8 yaml 文件解析 | 一文搞定 YOLOv8 分类任务,检测任务,分割任务,关键点任务 阅读详情

相关推荐

Allan方差读图分析IMU误差指标

Allan方差标定IMU参数实测分析

weixin_44927558的博客 3566

《Rust权威指南》 第7章 使用包、单元包、模块来管理项目

Module在一个crate内,将代码进行分组增加可读性。易于复用控制项目的私有性建立Modulemod 模块名 {...}可嵌套module内可包含其他项(结构体、枚举、常量、trait、函数等)的定义例子:在package my_project下的src/lib.rs文件中,写入下面代码} } }和src/lib.rs称为crate root就体现在这,这两个文件的内容各自组成了名为crate的模块,位于crate模块结构的根部这个模块结构也称为模块树。

Crescenx的博客 482

告别玄学:手把手配置EtherCAT从站PDI接口与同步采样(含Sync/Latch信号实战)

本文详细解析了EtherCAT从站PDI接口配置与同步采样技术,涵盖微处理器通信与直接驱动IO模式选择、同步采样四大触发模式(SOF、Latch_in、Sync0/Sync1)及输出触发实战。通过伺服驱动器实例,帮助工程师突破配置难点,实现高精度同步控制,提升工业自动化系统性能。

weixin_30667649的博客 483

【Rust 基础篇】Rust 模块详解

在 Rust 中,可以使用mod关键字来定义一个模块。模块可以包含其他模块、函数、结构体、枚举和常量等内容。模块可以嵌套,形成层次结构。// 模块内部的代码 // 函数、结构体、枚举、常量等 }在上述示例中,我们使用mod关键字定义了一个名为my_module的模块。模块的定义位于花括号{}内部。在模块内部,我们可以定义各种内容,如函数、结构体、枚举和常量等。本篇博客详细解析了 Rust 中的模块概念,包括模块的定义、结构、访问控制以及使用。

繁依Fanyi的博客 2323

从12摄像头到纯视觉:小鹏AI鹰眼方案如何用LOFIC技术省掉激光雷达?

本文深入解析小鹏汽车AI鹰眼方案如何通过LOFIC技术实现纯视觉自动驾驶,替代传统激光雷达。LOFIC摄像头在动态范围、噪声控制和HDR优化方面表现卓越,结合800万像素双目广角摄像头,达到激光雷达级测距精度。该方案不仅降低成本,还提升系统可靠性和用户体验,展示了纯视觉路线的技术潜力与边界。

t8u9v0w1x的博客 932

图形学基础知识:着色(三)Rendering Pipeline与Shader

管线(Pipeline) 什么是管线? 管线我们可以理解为流水线,流水线大家都懂,就是工厂里面生产东西的一整套流程。例如饮料厂要生产饮料,需要洗瓶子,倒饮料,加盖,包装等等,这一整套过程就是流水线。那么我们要把一个三维场景渲染成一幅二维的图像,同样需要一个先干嘛再干嘛然后干嘛最后干嘛的过程,这个过程或流水线,我们就称之为管线。 实时渲染管线(Real-time Rendering Pipeline) 通过前面几篇的学习,我们知道了要把一个三维场景渲染成一幅二维的图像大致分为以下几个步骤: M.

王王王渣渣的博客 2532

【Rust】包和模块管理,以及作用域等问题——Rust语言基础15

use:将路径引入作用域;pub:使对应项变为公有性质;as:为同名函数起别名。rust项目是从crate根节点开始检索代码:这很好理解,对于一个二进制crate的根就是,而库则是src/lib.rs,就类似在C/C++中总是以main函数开始;声明模块:在crate根文件中用mod关键字可以声明一个模块,如:// 中国最大的保时捷&法拉利元素融合高性能新能源汽车集团这便是声明了一个xiaomi_car模块,而当后是一个大括号时,这样的方式成为内联。

Imagine Miracle的博客 1840

ImportError: DLL load failed: 找不到指定的程序的解决方案

本文主要介绍了ImportError: DLL load failed: 找不到指定的程序的解决方案,希望能对使用Python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 18万+

Rust的模块化

Rust的模块化,要从入口文件说起。

欢迎来到我的博客!我是一名拥有20年以上经验的系统架构师。作为一名技术爱好者,我相信技术的力量可以改变世界。 1275

手把手教你在飞牛 NAS 上部署自有图床,含Python调用接口

📸 想在飞牛 NAS 上部署图床?这篇教程超适合小白!从安装到使用,步骤清晰~

XiaoqiangClub的博客 2344

基于深度学习的番茄成熟度检测系统——YOLOv5、YOLOv8、YOLOv10及UI界面的实现

YOLO是一种快速且准确的目标检测模型,近年来,YOLOv5、YOLOv8和YOLOv10作为YOLO系列的重要版本,分别在速度、精度和效率上进行了优化。下面我们简要介绍这些模型。本文介绍了如何基于YOLOv5、YOLOv8和YOLOv10等深度学习模型,结合PyQt5设计一个番茄成熟度检测系统。通过训练模型、优化算法和设计用户友好的界面,我们能够构建一个高效且准确的番茄成熟度检测系统,广泛应用于农业自动化和智能化管理中。

YOLO 1002

软考真题知识点(软件设计师中级)

目录 专利权 软件许可 图像深度 软件开发设计 原型化软件开发方法 软件项目风险 计算机组成原理 CPU 浮点数 检验码 计算机操作系统 进程管理 文件管理可靠性 计算机网络 防火墙 数字证书 ARP协议 ping命令 tracert命令 nslookup命令 其他概念 UML语言 CVS 类的实例化 设计模式 数据流图 面向对象开发方法 编程语言 专利权 根据我国专利法第九条规定"两个以上的申请人分别就同样的发明创造申请专利的,专利权...

码农研究僧的博客 7291

利用R语言通过holtwinters模型进行预测

使用Holt-Winters模型进行预测的第一步是对模型进行拟合。该函数需要两个参数:您的时间序列数据和一个“seasonal”参数,该参数指示您的数据的周期性(例如,如果您的数据按月记录,则应将“seasonal”参数设置为12,因为一年有12个月)。拟合模型后,您可以使用“forecast()”函数进行预测。该函数需要两个参数:您的拟合模型以及您要进行预测的时间段的长度。要使用Holt-Winters模型,您需要安装并加载“forecast”包。以下是进行Holt-Winters模型预测的示例代码。

Mrrunsen的博客 1696

腐蚀rust服务器命令_Rust 包装和板条箱的使用

我们将介绍的模块系统的第一部分是包装和包装箱。条板箱是二进制文件或库。该箱根是源文件是生锈编译器开始,让你的箱子的根模块(我们将在解释深度模块“定义模块来控制范围和隐私”一节)。甲包是一个或多个板条箱,其提供一组功能。一个软件包包含一个Cargo.toml文件,该文件描述了如何构建这些包装箱。几个规则确定软件包可以包含的内容。一个程序包必须包含零个或一个库条板箱,并且不能包含更多。它可以包含任意数...

weixin_29441555的博客 1044

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

07-使用Package、Crates、Modules管理项目

在本节中,我们将讨论模块和模块系统的其他部分,即允许命名项目的路径、将路径引入作用域的 use 关键字,以及使项目公开的 pub 关键字。我们还将讨论 as 关键字、外部包和 glob 操作符。首先,我们将列出一个规则列表,以便将来组织代码时参考。然后,我们将详细解释每一条规则。

优快云爱好者的独到见解 1600

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

终极隐私保护AI会议助手:4倍速本地转录与智能纪要生成

在数字化协作时代,会议记录是团队协作中最耗时却又最关键的环节之一。Meetily 作为一款开源免费的AI会议助手,彻底改变了传统会议记录方式,将专业级语音转录、智能摘要生成和隐私保护完美结合,为企业和个人提供100%本地化处理的完整解决方案。 ## 🎯 项目核心亮点:隐私与性能的完美平衡 Meetily 最大的优势在于其**隐私优先的设计理念**和**4倍速的实时转录能力**。与依赖云服务的

gitblog_00903的博客 229

pscad IEEE标准系统搭建说明

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

Czkawka:用开源磁盘清理工具管理重复文件、相似图片与空文件夹的实用指南

Czkawka 是一款用 Rust 编写的免费开源磁盘管理工具,帮助普通用户在电脑中查找重复文件、相似图片和空文件夹,同时提供空文件、临时文件、大文件清理等能力。如果你经常管理照片库、视频资料,或总觉得磁盘空间不够用,它的扫描与预览流程会比较合适。 ## 为什么需要专门的磁盘管理工具 系统盘告急时,多数人第一反应是清理下载文件夹,但真正占用空间的文件往往藏在别处: - 同一张照片的原始版、裁

gitblog_01042的博客 70

AppFlowy深度解析:如何构建下一代开源AI协作工作空间

AppFlowy作为Notion的开源替代品,正在重新定义AI协作工作空间的边界。这个项目将Flutter的跨平台能力与Rust的高性能后端完美结合,为开发者提供了一个完整的、可定制的生产力工具解决方案。通过本文,我们将深入探索AppFlowy的技术架构、安装配置以及实际应用场景,帮助您全面了解这个创新的开源项目。 ## 项目亮点与核心价值 ### 🔥 真正的数据主权与开源自由 AppFlo

gitblog_00280的博客 424

从Ask HN到工程实践:构建&展示值得骄傲的开源项目

在开发者社区中,一个常被讨论的问题是:什么样的项目才真正值得骄傲?这不仅是情感共鸣,更映射出项目规划、技术选型与工程交付的底层逻辑。真正令人自豪的项目往往源于真实需求,拥有明确边界、可复用性,并能沉淀为个人技术资产。从Side Project到开源作品,开发者需要掌握从最小闭环构建、自动化测试到文档撰写的完整方法。借助GitHub与持续集成,普通人也能将想法转化为可展示的工程成果,并在复盘与维护中持续成长。本文结合社区讨论与工程实践,呈现一套从0到1的实操路径,帮助你完成第一个能打动自己与他人的代码作品。

weixin_34290096的博客 419

Rust基础知识讲解

在 Rust 中,切片使用符号从数据结构中借用值。切片的类型表示为&[T],其中T表示元素的类型。对于字符串切片,它被特别表示为&str。Vec<T>用于存储多个同类型值的动态数组。String是可变的、UTF-8 编码的字符串类型。存储键值对,提供快速的查找。这些集合类型在 Rust 中非常常用,熟练掌握它们的使用对于编写 Rust 程序非常重要。每种类型都有其特定的用途和优化点,了解它们的工作原理和适用场景可以帮助你更高效地使用 Rust。

www_tlj的专栏 2320

用Rust写操作系统(1)一个独立的rust二进制程序

一个独立的rust二进制程序 原文 https://os.phil-opp.com/freestanding-rust-binary/ 原作者 phil-opp 译者 readlnh 创建一个不依赖于标准库的rust可执行文件是我们创建属于自己的操作系统内核的第一步。这将使得在不依赖于底层操作系统的情况下在裸机bare metal 上运行一个rust程序成为可能。 这个系列的blog在Git...

readlnh的博客 4044

Rust 模块系统

其中.d文件是用于依赖跟踪的。主要用于构建系统中,以确保在源代码文件更改时,所有依赖该文件的其他文件也会被重新构建。这种做法可以提高构建的效率,因为只有需要重新编译的文件才会被构建,而不会被重新编译的文件则会被跳过。第二种形式就是库,库其实就是工具包,只不过它提供的工具是函数/类/结构体/空间等等,它没有 main 函数,也不会编译为可执行程序,只能编译出类似于 dll/lib 之类的文件。.rlib文件包含了库的元数据和编译后的代码,它们是以平台无关的方式生成的,因此可以在不同的操作系统和架构上使用。

只为龙舞的博客 1118

rust 里面 pub mod 和pub use的意思

pub mod 相当于把该mod复制到这个pub mod语句处 再冠以pub pub use 相当于缩短路径(即use本来的意义) 加上 复制该被引入项到这个pub use语句处 再冠以pub 简单记法: 复制 冠以pub ...

realHaha 5939

rust引入mod

如图,创建一个项目mytest,项目src下有main.rs,nb.rs,school目录下有student.rs和main.rs同目录的使用mod直接引入。和main.rs不用目录的使用pub mod引入。

qq_44513642的博客 1181

Rust- 模块

(2)在 项目名\mylib\src\lib.rs文件中实现新模块。(1)在项目根目录下创建mylib(里面实现自定义的外部模块)(3)在项目名\src\main.rs中导入外部模块。

青衫客36的博客 917

Rust知识点总结

pub: 表示struct字段, impl块和模块的公共可见性。 pub mod xxx 与 pub use xxx pub mod xxx ;相当于把xxx复制到这个pub mod语句处,再冠以pub (这个比较好理解) pub use yyy 相当于java的import(即use本来的意义) ,或者说 建立快捷方式链接 Rust 中的关键字(Keywords) as: 基本类型变换, 消除某个项中包含的特定trait的歧义性, 或者是重命名use和extern crate中所用到的项.

yzpbright的博客 1076
上一篇: Rust之包,箱和模块管理(一):包和箱
下一篇: Rust之包,箱和模块管理(三):引用模块树中项目的路径
枫★曦
博客等级 码龄19年 251粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值