【Rust】007-包管理与模块管理

【Rust】007-包管理与模块管理

文章目录

  • 【Rust】007-包管理与模块管理
  • 一、包管理器:Cargo
    • 1、简介
      • Cargo 官方文档
      • 仓库
    • 2、项目初始化
    • 3、写一个小程序
      • 任务目标
      • 寻找合适的库
      • 添加库到我们的项目中
      • 代码实现
      • `cargo run`运行
  • 二、模块管理
    • 1、概述
    • 2、文件作为模块
      • 第一步:创建文件 `apple.rs`
      • 第二步:创建文件 `pear.rs`
      • 第三步:在 `main.rs` 引入
      • 第四步:调用模块内的函数
      • 另一种写法
    • 3、文件夹作为模块
      • 概述
      • 文件结构
      • 相关文件
      • 在 `main.rs` 中引入并调用函数
    • 4、文件内新建子模块
      • 子模块代码示例
      • `main.rs` 中调用
    • 5、一个文件下定义多个模块
      • 文件结构
      • `fruit.rs` 定义
      • `main.rs` 调用
    • 6、子模块新版写法
      • 说明
      • 文件结构
      • `fruit.rs` 写法
      • `main.rs` 调用

一、包管理器:Cargo

1、简介

Cargo 是Rust 语言的包管理器。Cargo 可以:

  1. 下载你的 Rust 包的依赖项;
  2. 编译你的包;
  3. 创建可分发的包,并将它们上传到crates.io(即Rust社区的包注册表)。

Cargo 官方文档

https://doc.rust-lang.org/cargo/


仓库

https://crates.io/


2、项目初始化

首先我们新建一个文件夹my_project,然后为这个文件夹初始化一个 Rust 项目吧!

mkdir my_project
>> cd my_project
>> cargo init

执行完上述三个命令之后,Cargo 会为my_project文件夹初始化一个 bin 类型的 Rust 项目(即默认编译目标为一个可执行的二进制文件)。我们可以看一下my_project文件夹里的内容:

my_project
├── Cargo.toml
└── src└── main.rs

其中src/main.rs中的main函数为整个程序的入口。Cargo.toml为这个项目的配置文件,可以配置包括依赖的包,编译选项等,但因为这个项目是一个新的项目,目前除了基本信息外没有其他内容。

我们用cargo run运行一下这个项目,成功输出 Hello, world!

cargo runCompiling my_project v0.1.0 (/Users/bytedance/rust/my_project)Finished dev [unoptimized + debuginfo] target(s) in 0.99sRunning `target/debug/my_project`
Hello, world!

如果想要初始化一个库类型的项目,供其他使用方使用(例如发布到 crates.io 上),在初始化的时候需要运行

cargo init --lib

它会在src文件夹下新建一个lib.rs的文件作为整个库的入口。


3、写一个小程序

任务目标

我们随机从 0,1 中取一个数,如果是 0,就输出 Hello,如果是 1 就输出 World。


寻找合适的库

我们首先去https://crates.io/上找一下有没有随机相关的库可以用。搜索一下就可以发现,有一个使用量非常多的库 rand。


添加库到我们的项目中

第一种方式:

>> cargo add rand

第二种方式:直接编辑Cargo.toml,在[dependencies]这一栏下增加:

rand = "0.8.5"

代码实现

// 引入 rand 库中的 random 函数,用于生成随机数
use rand::random;fn main() {// 生成一个随机的 i64 类型的整数,然后对 2 取模// 结果要么是 0,要么是 1let gen = random::<i64>() % 2;// 如果随机数取模结果是 0,打印 "Hello"if gen == 0 {println!("Hello");} else { // 否则(结果是 1),打印 "World"println!("World");}
}

cargo run运行

PS D:\MyFile\RustroverProjects\hello> cargo run     Compiling byteorder v1.5.0Compiling getrandom v0.2.15Compiling rand_core v0.6.4                                                                                                                                    Compiling zerocopy v0.7.35                                                                                                                                    Compiling ppv-lite86 v0.2.20                                                                                                                                  Compiling rand_chacha v0.3.1                                                                                                                                  Compiling rand v0.8.5                                                                                                                                         Compiling hello v0.1.0 (D:\MyFile\RustroverProjects\hello)                                                                                                    Finished dev [unoptimized + debuginfo] target(s) in 2.26s                                                                                                    Running `target\debug\hello.exe`
World
PS D:\MyFile\RustroverProjects\hello># 多运行两次
PS D:\MyFile\RustroverProjects\hello> cargo runFinished dev [unoptimized + debuginfo] target(s) in 0.02sRunning `target\debug\hello.exe`
World
PS D:\MyFile\RustroverProjects\hello> cargo runFinished dev [unoptimized + debuginfo] target(s) in 0.02sRunning `target\debug\hello.exe`
Hello
PS D:\MyFile\RustroverProjects\hello> 

二、模块管理

1、概述

当项目非常大的时候,我们需要一种将项目代码根据不同功能划分的方法,且各个功能之间的访问是可以自主控制的。这个方法在 Rust 中就是模块。

通过 Rust 的模块管理,我们可以做到:

  1. 组织项目代码;
  2. 可见性控制。

2、文件作为模块

第一步:创建文件 apple.rs

pub fn eat_apple() {println!("I eat apple");
}

第二步:创建文件 pear.rs

pub fn eat_pear() {println!("I eat pear");
}

当前目录结构:

image-20240904224210808


第三步:在 main.rs 引入

mod apple;
mod pear;fn main() {
}

第四步:调用模块内的函数

mod apple;
mod pear;fn main() {apple::eat_apple();pear::eat_pear();
}

另一种写法

mod apple;
mod pear;use crate::apple::eat_apple;
use crate::pear::eat_pear;fn main() {eat_apple();eat_pear();
}

3、文件夹作为模块

概述

如果把所有模块都平铺到src/文件夹下的话,项目一大文件就会非常多。所以我们需要一个通过文件夹组织模块的方法。如果要将文件夹作为模块,在文件夹下一定要有一个mod.rs的文件。这个文件类似src/main.rs或者src/lib.rs,该文件(mod.rs)控制该文件夹下所有其他文件模块的引入。


文件结构

image-20240904224444834


相关文件

// eat.rs
pub fn eat_orange() {println!("I eat orange");
}// mod.rs
pub mod eat;

main.rs 中引入并调用函数

mod apple;
mod pear;
// 引入文件夹模块 orange
mod orange;use crate::apple::eat_apple;
use crate::pear::eat_pear;fn main() {eat_apple();eat_pear();// 调用 orange 文件夹下的 eat.rs 文件orange::eat::eat_orange();
}

4、文件内新建子模块

子模块代码示例

在文件内如果想新建模块的话,可以用mod关键字,且这个是可以嵌套的

mod fruit {mod apple {pub fn eat_apple() {println!("I eat apple");}}mod pear {pub fn eat_pear() {println!("I eat pear");}       }mod orange {pub fn eat_orange() {println!("I eat orange");}               }
}

main.rs 中调用

mod fruit {pub mod apple {pub fn eat_apple() {println!("I eat apple");}}pub mod pear {pub fn eat_pear() {println!("I eat pear");}}pub mod orange {pub fn eat_orange() {println!("I eat orange");}}
}fn main() {fruit::apple::eat_apple();
}

5、一个文件下定义多个模块

文件结构

your_project/
├── src/
│   ├── main.rs
│   └── fruit.rs

fruit.rs 定义

pub mod apple {pub fn eat_apple() {println!("I eat apple");}
}pub mod pear {pub fn eat_pear() {println!("I eat pear");}
}pub mod orange {pub fn eat_orange() {println!("I eat orange");}
}

main.rs 调用

mod fruit;fn main() {fruit::apple::eat_apple();
}

6、子模块新版写法

说明

新版本的改进:在较新的 Rust 版本中,你可以将 fruit.rs 模块的子模块放在一个同名的目录中,即 fruit/ 目录。这种方式让代码结构更清晰,尤其是当模块变得复杂时。

例如,你有一个 fruit.rs 文件,它是一个模块。你可以在项目的同一层级下创建一个名为 fruit 的目录,然后在这个目录中放置该模块的子模块文件。


文件结构

image-20240904230308156


fruit.rs 写法

pub mod apple;
pub mod pear;pub fn eat_fruit() {println!("I eat apple");
}

main.rs 调用

mod fruit;fn main() {fruit::apple::eat_apple();fruit::pear::eat_pear();fruit::eat_fruit();}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

前端模拟面试:如何检查JavaScript对象属性是否存在?

你正在参加一场关键的前端开发面试&#xff0c;面试官提出了一个经典的JavaScript问题&#xff1a;“在JavaScript中&#xff0c;如何检查对象是否包含某个属性&#xff1f;请你详细介绍几种不同的方法&#xff0c;并解释它们的区别。” 这个问题不仅考验你对JavaScript的基础掌…

怎样在公司将手机屏幕(远程)投屏到家里的大电视上?

我不住家里&#xff0c;前几次回去都会替老爸老妈清理手机。这两个星期没空回去&#xff0c;老爸吐槽手机用几天就又卡了&#xff0c;其实就是清理一些手机缓存的问题。 我说我远程控制他的手机&#xff0c;给他清理一下。他一听“控制”就不喜欢&#xff0c;说我大了&#xf…

sM4040B科学级显微制冷相机特性

sM4040B科学级显微制冷相机特性 sM4040B搭载了 GSENSE4040BSI 3.2 英寸图像传感器&#xff0c;针对传感器固有的热噪声&#xff0c;专门设计了高效制冷模块&#xff0c;使得相机传感器的工作温度比环境温度低达 35-40 度。针对制冷相机常见的低温结雾现象设计了防结雾机制&…

【Python百日进阶-Web开发-音频】Day707 - 时域处理 librosa.autocorrelate

文章目录 一、时域处理1.1 librosa.autocorrelate1.1.1 语法与参数1.1.2 例子1.1.2.1 计算完全自相关y1.1.2.2 计算长达 4 秒的起始强度自相关 一、时域处理 1.1 librosa.autocorrelate https://librosa.org/doc/latest/generated/librosa.autocorrelate.html 1.1.1 语法与参…

哪款宠物空气净化器能更好的清理浮毛?希喂、352、IAM测评分享

家里这三只可爱的小猫咪&#xff0c;已然成为了我们生活中不可或缺的家庭成员&#xff0c;陪伴我们度过了说长不长说短不短的五年时光。时常庆幸自己当年选择养它们&#xff0c;在我失落的时候总能给我安慰&#xff0c;治愈我多时。 但这个温馨的背后也有一点小烦恼&#xff0…

记一种常用的实时数据同步方案:Canal+Kafka+Flume

记一种常用的实时数据同步方案&#xff1a;CanalKafkaFlume 在当今数据驱动的业务环境中&#xff0c;数据同步是确保系统间数据一致性的关键环节。一种高效、稳定且可扩展的数据同步方案对于支撑企业的数据处理和分析需求至关重要。本文将介绍一种结合了Canal、Kafka和Flume的…

IOS 20 发现界面(UITableView)歌单列表(UICollectionView)实现

发现界面完整效果 本文实现歌单列表效果 文章基于 IOS 19 发现界面&#xff08;UITableView&#xff09;快捷按钮实现 继续实现发现界面歌单列表效果 歌单列表Cell实现 实现流程&#xff1a; 1.创建Cell&#xff0c;及在使用UITableView的Controller控制器上注册Cell&#x…

STM32F103C8----GPIO(跟着江科大学STM32)

一&#xff0c;GPIO简介 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口 可配置为8种输入输出模式 引脚电平&#xff1a;0V~3.3V&#xff08;0V&#xff09;&#xff0c;部分引脚可容忍5V 输出模式下可控制端口输出高低电平&#xff0c;用以驱动…

AI-Talk开发板之LED

一、说明 AI-Talk开发板上有一颗用户LED&#xff0c;连接在CH32 PA2管脚&#xff0c;低电平亮&#xff0c;高电平灭。 相关电路图如下&#xff1a; 需要提前给CH32V003烧录特定的固件才能将CH32作为CSK6011A的exmcu&#xff0c;参考AI-Talk开发板更新CH32固件。​​​​​​​…

如何查看Mac的处理器架构‌‌是ARM还是x86

‌通过命令行查看Mac的处理器架构‌‌ 打开终端&#xff08;Terminal&#xff09;。输入命令 uname -m 并回车。如果输出结果是 arm64&#xff0c;则表示你的Mac使用的是ARM架构&#xff1b;如果输出结果是 x86_64&#xff0c;则表示你的Mac使用的是x86架构。 如图&#xff1…

2024/9/4黑马头条跟学笔记(二)

app端文章列表 学习内容 需求分析 上方分类频道切换 布局&#xff0c;无图&#xff0c;单图&#xff0c;三张图 文章数据库表 导入文章数据库 结构分析 配置-文章 一对一&#xff0c;拆表&#xff0c;冷热数据分离满足范式 表的拆分-垂直分表 优势 查文章信息不会连带查…

Day10_0.1基础学习MATLAB学习小技巧总结(10)——程序流程控制

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍&#xff0c;为了在这个过程中加深印象&#xff0c;也为了能够有所足迹&#xff0c;我会把自己的学习总结发在专栏中&#xff0c;以便学习交流。 素材来源“数学建模清风” 特此说明&#xff1a;本博客的内容只在于总结在…

页面小组件-搜索栏(一)

样例展示 效果示例-折叠状态 效果示例-展开状态 代码示例 <custom-search-wrapper><!--showFoldBtn 需要展示折叠按钮时传值--><template slotleft><el-form:model"searchFormData"inlinesize"small"><el-form-item><e…

前端入门了解

1. 网页 1.1 网页概述 1.2 超文本标记语言 1.3 网页的形成 2. 浏览器了解 网页需要通过浏览器来展示&#xff0c;下面是关于浏览器的两点; 国际上通用的浏览器有如下六个&#xff08;百度&#xff0c;360&#xff0c;uc等是主要在国内使用&#xff09;&#xff0c; 3. We…

828华为云征文:华为云 Flexus X 实例性能测评——SuperBench 一键窥见性能

今天我拿到了华为云 Flexus X 实例&#xff0c;这款云服务是华为云推出的有一款明星产品&#xff0c;面向零售、金融、游戏等行业大多数通用工作负载场景。这次&#xff0c;我们就来测评一下它的性能到底怎么样&#xff01; Flexus 云服务 X 实例 在测评之前&#xff0c;我们…

使用 JAXB 将内嵌的JAVA对象转换为 xml文件

使用 JAXB 将内嵌的JAVA对象转换为 xml文件 1. 需求2. 实现&#xff08;1&#xff09;FileDesc类&#xff08;2&#xff09;MetaFileXml类&#xff08;3&#xff09;生成对应的xml文件 1. 需求 获取一个目录下所有文件的元数据信息&#xff08;文件名、大小、后缀等&#xff0…

Day14_0.1基础学习MATLAB学习小技巧总结(14)——字符串的比较、查找和替换

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍&#xff0c;为了在这个过程中加深印象&#xff0c;也为了能够有所足迹&#xff0c;我会把自己的学习总结发在专栏中&#xff0c;以便学习交流。 素材来源“数学建模清风” 特此说明&#xff1a;本博客的内容只在于总结在…

香港一带一路研究院国际事务研究中心副主任陈景才阐述香港在一带一路建设及区块链金融领域的关键作用

2024年8月28日&#xff0c;香港金管局举行Ensemble项目沙盒&#xff08;以下简称沙盒&#xff09;启动仪式&#xff0c;并宣布首阶段试验将涵盖四大代币化资产用例主题&#xff0c;标志着金融业在代币化技术的实际应用进程中迈出重要一步。香港一带一路研究院国际事务研究中心副…

Tomato靶场渗透测试

1.扫描靶机地址 可以使用nmap进行扫描 由于我这已经知道靶机地址 这里就不扫描了 2.打开网站 3.进行目录扫描 dirb http&#xff1a;//172.16.1.113 发现有一个antibot_image目录 4.访问这个目录 可以看到有一个info.php 5.查看页面源代码 可以发现可以进行get传参 6.…

苹果抽佣30%,国产手机抽佣50%,而且国产手机联合抽佣更霸道!

随着苹果抽佣30%被炒作&#xff0c;吐槽苹果的越来越多&#xff0c;然而国产手机抽佣50%&#xff0c;却没有人说话&#xff0c;甚至还有人为国产手机辩护&#xff0c;说什么可以自由选择&#xff0c;然而他们忘记了国产手机联合成立了硬核联盟共同抽佣50%&#xff0c;想逃&…