Rust基础学习-ModulesPackage

在Rust中,模块有助于将程序分割成逻辑单元,以提高可读性和组织性。一旦程序变得更大,将其拆分为多个文件或命名空间非常重要。

模块有助于构建我们的程序。模块是项目的集合:包括函数、结构体甚至其他模块。

cargo


Module

定义模块

Rust中,可以使用mod关键字来定义一个模块,语法如下:

mod module_name {// code
}

这里,module_name 是模块的名称。看下面的例子;

mod config {fn print() {println!("config!");}
}

上面的示例中,我们使用mod定义了以config为名称的一个模块。在模块内部,我们定义 了一个简单的函数print;


Rust 模块内项目的可见性

模块中的项目可以是私有的或公共的。默认情况下,模块是私有的。

这意味着模块内部的项目无法在模块外部访问。pub 关键字可用于使项目具有公共可见性。让我们看一个示例。

mod config {// items in modules by default have private visibilityfn select() {println!("called config::select");}// use the `pub` keyword to override private visibilitypub fn print() {println!("called config::print");}
}

在这里,我们定义一个名为config的模块,其中包含两个函数select()print()

print()函数以pub关键字开头,这意味着它具有公共可见性。但select()函数则没有。

如果你此时运行程序会发现有一些警告,这是因为我们并没有调用这些函数,现在,我们尝试调用一下;

mod config {// items in modules by default have private visibilityfn select() {println!("called config::select");}// use the `pub` keyword to override private visibilitypub fn print() {println!("called config::print");}
}fn main() {// public items inside module can be accessed outside the parent module// call public print function from display moduleconfig::print();
}

在这里,我们使用config::print()语法来调用 config 模块内的公共函数 print():: 运算符用于分隔模块名称和要在模块内调用的项目。

但是,模块内部的私有项目不可在模块外部访问。如果我们尝试在 config 模块内调用私有函数 select(),将会收到编译错误。


注意:当在模块内部某个用pub修饰的方法调用模块内部非pub方法时,我们在调用该pub方法时,其涉及到的非pub方法也将具有pub性质;

我们看个例子:

mod player {// private functionfn focus() {println!("called player::focus");}// public functionpub fn shift() {println!("called player::shift");}// public functionpub fn jump() {// call private function focus and shift inside the modulefocus();shift();println!("called player::jump");}
}fn main() {// call public function jump from player moduleplayer::jump();
}

called player::focus
called player::shift
called player::jump

在这里,我们在player模块内定义了多个函数。请注意,我们能够在同一模块内的另一个函数jump()中调用私有函数focus()


模块嵌套

一个模块中还可以在定义其他模块,这就是模块的嵌套;看例子:

// nested module
pub mod player {pub mod sprite {pub fn create() {println!("called player::sprite::create");}}
}fn main() {// call public function create from sprite module which is inside player module player::sprite::create();
}

输出:

called player::sprite::create

在这里,我们将一个 sprite 模块嵌套在 player 模块内部。我们在 sprite 模块内定义了一个名为 create() 的公共函数,在 main() 函数中通过 player::sprite::create() 调用。


use关键字

我们可以使用use关键字将模块内的项目引入当前作用域。use关键字帮助我们消除调用函数时写出完整模块路径的需要。让我们通过使用use关键字来重新编写我们的嵌套模块示例。

// nested module
pub mod player {pub mod sprite {pub fn create() {println!("called player::sprite::create");}}
}// bring the create function into scope
use player::sprite::create;fn main() {// call public function directlycreate();
}

这里,我们使用 use 关键字从 player 模块内部的 sprite 模块中将 create() 函数引入当前作用域。

这样我们可以直接调用 create() 函数,而不需要完全限定名称为 player::sprite::create()。


Crate和Package

一个 crate 可以包含一个或多个 Rust 模块,这些模块可以包含诸如函数、类型和常量之类的代码。

一个 crate 有两种类型:二进制 crate 和库 crate。二进制 crate 是一个 Rust 程序,编译成一个可执行文件或多个可执行文件,并且每个可执行文件都有一个 main() 函数。

crate 不会编译成可执行文件,也没有 main() 函数。库 crate 通常定义了可以在多个项目中使用的共享功能。Crates 可以捆绑在一起形成一个 package


可以使用内置在Rust中的Cargo软件包管理器来创建软件包。 Cargo与Rust一起预安装。我们可以使用 cargo 来创建一个软件包。一个软件包包含一个或多个提供一组功能的crate。

一个包中可以包含许多二进制 crate,但最多只能包含一个库 crate。


创建二进制包

要创建一个二进制包,我们可以在终端中使用 cargo 命令。

$ cargo new hello_world --bin

我们使用 cargo --bin选项创建一个二进制包 hello_world。 这是 cargo 的默认行为。 让我们来看看 hello_world 包的内容。

hello_world
├── Cargo.toml
└── src└── main.rs
  • hello_world 是包目录
  • Cargo.toml 是一个包含有关 crate 的元数据的文件,如其名称、版本和依赖项
  • src/main.rs crate 根目录,包含二进制包的源代码

创建库包

$ cargo new hello_world_lib --lib

包结构如下:

hello_world_lib
├── Cargo.toml
└── src└── lib.rs
  • hello_world_lib 是包目录
  • Cargo.toml 是一个包含有关包的元数据的文件,例如其名称、版本和依赖关系
  • src/lib.rs 是 crate 根目录,包含库包的源代码

一个包可以包含src/main.rssrc/lib.rs。在这种情况下,它有两个 crate:一个二进制 crate 和一个库 crate,两者都与包的名称相同。例如,

hello_world
├── Cargo.toml
└── src└── lib.rs└── main.rs

Cargo包管理器

Cargo

CargoRust的包管理器。它与Rust一起预装,并可用于打包依赖项,管理它们以及构建和分发我们自己的包/库。

cargo的特点:

  • 依赖管理

Cargo 可轻松管理我们项目的依赖项,包括添加、更新和删除依赖项。
构建和打包

Cargo 可自动构建和打包我们的 Rust 项目,创建可与他人共享的二进制或库代码。

  • 文档生成

Cargo 可自动为我们的代码生成文档,使其他开发人员更容易理解和使用我们的库。

  • 下载 crate

Cargo 可从 crates.io 下载并安装库,这是 Rust crate 的中央存储库。

  • 运行二进制或测试

Cargo 可构建我们的源代码,运行可执行二进制文件,并运行我们的测试。


依赖管理

Cargo 的主要功能之一是可以下载、管理外部库。让我们看看如何从 crates.io 使用外部 crate 的示例。crates.io 是一个中央仓库,我们可以从中获取和发布用于 Rust 的共享库。

  • 创建一个项目
$ cargo new hello_world
  • 添加一个生成随机数的依赖rand,我们可以在cargo.toml中的[dependencies]部分进行添加
name = "hello_world"
version = "0.1.0"
edition = "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]
rand = "0.8.5"

我们还可以使用命令 cargo add rand 来为我们的项目添加依赖。

注意,如果通过命令的方式添加依赖,在添加时Rust就会加载编译该依赖,而通过cargo.toml手动添加时,程序会在你首次运行程序时进行加载编译的操作。

  • 使用依赖
use rand::Rng;fn main() {let mut rng = rand::thread_rng();// simulate rolling a dieprintln!("roll = {}", rng.gen_range(1..=6));
}# Output: roll = 5

构建和执行

Rust支持使用cargo命令对程序进行buildrun.命令分别是

  • cargo build
  • cargo run

一般情况下,执行cargo run时,默认会自动执行cargo build,所以一般我们需要运行程序时不需要先执行build,再执行run,而是直接执行cargo run即可。

常用命令一览表:

CommandDescription
cargo newCreate a new Rust project with basic directory structure
cargo buildBuild (compile) the current project and generate a binary executable
cargo runBuild and run your current project (cargo build + run)
cargo checkBuild the current project without generating a binary executable
cargo addAdd a new dependency and include it in Cargo.toml file
cargo updateUpdate all dependencies of current project to latest version

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cleanmymacX和腾讯柠檬到底哪个好用 2024最新使用测评

CleanMyMac X和腾讯柠檬都是Mac系统清理软件,各有其特点和优势,选择哪个更好用取决于用户的具体需求和使用习惯。 经常有新关注的粉丝问,同样做为垃圾清理软件,付费CleanMyMac和免费的柠檬清理哪个更好用?其实&#xf…

大数据集成平台建设方案(Word方案)

基础支撑平台主要承担系统总体架构与各个应用子系统的交互,第三方系统与总体架构的交互。需要满足内部业务在该平台的基础上,实现平台对于子系统的可扩展性。基于以上分析对基础支撑平台,提出了以下要求: 基于平台的基础架构&…

为什么选择 ABBYY FineReader PDF ?

帮助用户们对PDF文件进行快速的编辑处理,同时也可以快速识别PDF文件里的文字内容,并且可以让用户们进行文本编辑,所以可以有效提升办公效率。 ABBYY-ABBYY Finereader 15 Win-安装包:https://souurl.cn/OY2L3m 高级转换功能 ABBY…

【Python】Python 2 测试网络连通性脚本

文章目录 前言1. 命令行传参2. 代码 前言 最近在只有python2的服务器上部署服务,不能用三方类库,这里出于好奇心学习下python。这里简单做个脚本,实现了检验网络连通性的功能(类似于curl)。 1. 命令行传参 使用命令…

成功塑造领军人物形象,对企业带来哪些好处?

在企业的完整形象中,产品、品牌、高管是最重要的组成部分。小马识途建议中小企业在成长过程中及早对高管形象进行包装,成功塑造企业的领军人物,不单单是企业高管个人的形象提升,对企业经营发展带来诸多益处。小马识途营销顾问简单…

跨行业数据资产整合与应用:探讨如何打破数据孤岛,实现跨行业数据资产的共享与协同应用

目录 一、引言 二、跨行业数据资产整合的必要性 1、数据价值的最大化 2、促进产业创新 3、提升政府治理能力 三、跨行业数据资产整合的挑战 1、技术挑战 2、制度挑战 3、利益挑战 四、打破数据孤岛的策略与方法 1、建立统一的数据标准与规范 2、构建跨行业数据共享…

“全光无线星空”照亮津亚电子智能制造之路

随着第四次工业革命浪潮的到来,智能制造正成为制造业的新常态。工业4.0时代的工厂不再是封闭的制造孤岛,而是通过高度的数字化和网络化,实现生产过程的智能化、自动化和灵活化。在这样的大趋势下,制造业正经历着从传统制造向智能制造的深刻转型,数字化车间和智能化生产线成为推…

Ubuntu 22.04安装 docker

安装过程和指令 # 1.升级 apt sudo apt update # 2.安装docker sudo apt install docker.io docker-compose # 3.将当前用户加入 docker组 sudo usermod -aG docker ${USER} # 4. 重启 # 5. 查看镜像 docker ps -a 或者 docker images # 6. 下载镜像 docker pull hello-world …

海康充电桩报文校验TCP校验和

1 TCP校验文档校验文档要求: 校验码描述 校验码计算范围包含包头标识、消息头和消息体,校验算法采用 TCP 和校验,具体规则如下。 将待校验的所有数据分为 16 位的字(大端序),如果总长度为奇数个字节,则在最后增添一个 位都为 0 的字节; 将所有 16 位的字进行累加,累加…

【YashanDB知识库】PHP使用ODBC使用数据库绑定参数功能异常

【问题分类】驱动使用 【关键字】ODBC、驱动使用、PHP 【问题描述】 PHP使用PDO_ODBC连接yashan数据库,使用绑定参数获取数据时,客户现场出现报错 本地复现未出现异常报错,但是无法正确获取数据。 【问题原因分析】开启ODBC报错日志后&am…

线代老师大PK,这四位胜出!

说实话,线代真的别乱跟老师 因为每个老师讲课适用的人群不一样,比如都说李永乐老师线代讲的好,但是我去听完发现,李永乐老师的线代讲的虽然好,但是对于零基础或者基础不好的考生来说,真的有点不友好&#…

dataguard备库延时加大,同步报错(ORA-01119、ORA-17502、ORA-15173),该如何解决?

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG数据库运维(如安装迁移,性能优化、故障应急处理等) 公众号:老苏畅谈运维 欢迎关注本人公众号,更多精彩与您分享。一大早…

MYSQL 三、mysql基础知识 7(MySQL8其它新特性)

一、mysql8新特性概述 MySQL从5.7版本直接跳跃发布了8.0版本 ,可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上 做了显著的改进与增强,开发者对MySQL的源代码进行了重构,最突出的一点是多MySQL Optimizer优化器进行了改进。不仅在速度…

【运维自动化-配置平台】如何使用云资源同步功能(腾讯云为例)

云资源同步是通过apikey去单向同步云上的主机资源和云区域信息,目前支持腾讯云和亚马逊云。主要特性 1、蓝鲸配置平台周期性的单向只读同步云主机和vpc(对应蓝鲸云区域)信息,第一次全量,后面增量 2、默认同步到主机池…

短剧系统源码短剧平台开发短剧小程序APP短剧模版Java源码

一.管理端设置及操作 1.系统配置 系统的配置项都在该列表中,使用前请配置好参数 2.签到积分设置 签到可以获取设置积分,连续签到按照设置的积分规则走,积分可以兑换余额,兑换比例按照配置104,余额可以消费 3.用户中心 所有的用户注册后都会在该列表展示,可以查看用户详情,也…

正点原子imx6ull 进度条颜色、logo位置上偏或色偏等问题

正点原子imx6ull 进度条改颜色 logo位置上偏或显示色偏等问题 开机进度条logo问题进度条界面全屏logo位置上偏进度条界面logo其他问题进度条界面去掉中间这条杠 uboot界面logo问题不显示uboot界面的打印信息uboot显示logo不理想uboot不显示logo 开机进度条logo问题 进度条界面…

拿来做课设哈哈哈-“久坐提醒器”的网页应用

这篇文章将介绍一个名为“久坐提醒器”的网页应用,它通过HTML、CSS和JavaScript三种技术实现。下面是对这三种技术在实现该应用中的作用和代码的详细解析。 HTML:构建网页结构 HTML(HyperText Markup Language)是网页的基础结构…

2. ceph存储组件

ceph存储组件 一、ceph存储介绍1、ceph介绍2、ceph提供的存储接口 二、ceph的核心组件三、crush算法 一、ceph存储介绍 分布式存储/文件系统,数据按特定的算法分散存储到不同的设备上 存在数据副本机制,保证数据的可靠性 典型的开源软件: ce…

LabVIEW RT在非NI硬件上的应用与分析

LabVIEW RT(实时操作系统)可运行在非NI(National Instruments)硬件上,如研华工控机,但需要满足特定硬件要求。本文从硬件要求、开发和运行差异、可靠性、稳定性、优势和成本等多角度详细分析在非NI硬件上运…

神经网络字符分类

按照题目要求修改了多层感知机 题目将图片的每个点作为输入,其中大小为28*28,中间有两个大小为100的隐藏层,激活函数是relu,然后输出大小是10,激活函数是softmax 优化器是Adam,结合了AdaGrad和RMSProp算法…