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

news2024/11/15 18:26:51

【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 run
   Compiling my_project v0.1.0 (/Users/bytedance/rust/my_project)
    Finished dev [unoptimized + debuginfo] target(s) in 0.99s
     Running `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,要么是 1
    let 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.0
   Compiling getrandom v0.2.15
   Compiling 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 run
    Finished dev [unoptimized + debuginfo] target(s) in 0.02s
     Running `target\debug\hello.exe`
World
PS D:\MyFile\RustroverProjects\hello> cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.02s
     Running `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.coloradmin.cn/o/2105896.html

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

相关文章

可靠性定义

一、广义可靠性 包含以下三个方面 1、可靠性&#xff08;Reliability&#xff09; 定义&#xff1a;产品、系统或组件在预定条件下和规定时间内&#xff0c;完成既定功能的能力。 平均故障间隔时间&#xff08;Mean Time Between Failures, MTBF&#xff09;&#xff1a; …

每天五分钟深度学习:广播机制(以python语言为例)

本文重点 因为向量化的计算方式导致效率的提升,所以现在很多时候,我们都是用向量化的计算,但是向量化计算有一个问题让人头痛就是维度的问题,本节课程我们将讲解python中的广播机制,你会发现这个机制的优秀之处。 代码实例 import numpy as np a=np.random.randn(3,4) …

使用 Milvus 和 Streamlit 搭建多模态产品推荐系统

我们可以使用 Milvus 搭建多模态 RAG 应用&#xff0c;用于产品推荐系统。用户只需简单上传一张图片并输入文字描述&#xff0c;Google 的 MagicLens 多模态 Embedding 模型就会将图像和文本编码成一个多模态向量。然后&#xff0c;使用这个向量从 Milvus 向量数据库中找到最相…

负载均衡 Ribbon 与 Fegin 远程调用原理

文章目录 一、什么是负载均衡二、Ribbon 负载均衡2.1 Ribbon 使用2.2 Ribbon 实现原理 (★)2.3 Ribbon 负载均衡算法 三、Feign 远程调用3.1 Feign 简述3.2 Feign 的集成3.3 Feign 实现原理 (★) 一、什么是负载均衡 《服务治理&#xff1a;Nacos 注册中心》 末尾提到了负载均…

简单的Linux Ftp服务搭建

简单的Linux FTP服务搭建 1.需求 公司有一个esb文件传输代理&#xff0c;其中我们程序有文件传输功能&#xff0c;需要将本地文件传输到esb文件代理服务器上&#xff0c;传输成功之后发送http请求&#xff0c;告知esb将固定文件进行传输到对应外围其他服务的文件目录中&#…

【高阶数据结构】秘法(二)——图(一):图的基本概念和存储结构

前言&#xff1a; 今天我们要讲解的是数据结构中图的部分&#xff0c;这部分在我们实际生活中也是经常会碰到的&#xff0c;同时这部分也是数据结构中比较有难度的部分&#xff0c;这部分内容我会把它分为多章来进行讲解&#xff0c;今天我们先来讲解一下图的基本概念和存储结构…

Codeforces Round 920 (Div. 3)(A,B,C,D)

A 在二维坐标轴上有一个正方形&#xff0c;给你一个正方形的四个顶点坐标&#xff0c;求面积 知道一个边长&#xff0c;平方即可 for(int i0;i<4;i)x[i]x1; Arrays.sort(x); //1122 kMath.abs(x[2]-x[1]); System.out.println(k*k); B 操作1、2是添加和修改&#xff0c;操…

Windows系统下的Spark环境配置

一&#xff1a;Spark的介绍 Apache Spark 是一个开源的分布式大数据处理引擎&#xff0c;它提供了一整套开发API&#xff0c;包括流计算和机器学习。Spark 支持批处理和流处理&#xff0c;其显著特点是能够在内存中进行迭代计算&#xff0c;从而加快数据处理速度。尽管 Spark …

【专题】2024年8月中国企业跨境、出海、国际化、全球化行业报告汇总PDF合集分享(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p37584 在全球化浪潮汹涌澎湃的当下&#xff0c;中国企业积极探索海外市场&#xff0c;开启了出海跨境的新征程。本报告合集旨在全面梳理出海跨境全球化行业的发展态势&#xff0c;涵盖多个领域的深度洞察。 从游戏、快消品、医疗器…

Python行结构(逻辑行、物理行、显式拼接行、隐式拼接行、空白行)

Python行结构 &#xff08;逻辑行、物理行、显式拼接行、隐式拼接行、空白行&#xff09; 本文目录&#xff1a; 零、时光宝盒 一、Python PEP8 编码行规范 1.1、Maximum Line Length 行的最大长度 1.2、在二元运算符之前应该换行吗&#xff1f; 二、Python行结构 2.1、物…

电子设计-基础3-电感与二极管

电子设计-基础3-电感与二极管 电感电感简介电感的发展历史电感的原理结构电感的性质&#xff1a; 电流惯性电感性质的演示 电感的分类常用的几种电感&#xff1a;一体成型电感一、定义与结构二、特点 三、工作原理四、应用领域 五、优缺点屏蔽电感 CD系列电感&#xff1a;多用于…

网站安全问题整改

网站安全、政务云、第三方安全检测机构等评测出来的网站web安全问题整改&#xff0c;如果你也正需要做这方面&#xff0c;请联系我吧

【代码随想录训练营第42期 Day50打卡 - dfs入门 - 卡码网 98. 所有可达路径

目录 一、dfs基础 二、模板题 题目&#xff1a;98. 所有可达路径 题目链接 题解&#xff1a;dfs邻接矩阵 三、小结 一、dfs基础 dfs是按照一个方向搜索到尽头再搜索其他方向。怎样实现对其他方向的搜索呢&#xff1f;我们可以通过回溯&#xff0c;撤销最后一步&#xff0c…

JUC-无锁之CAS

问题提出 (应用之互斥) package cn.itcast; import java.util.ArrayList; import java.util.List; interface Account {// 获取余额Integer getBalance();// 取款void withdraw(Integer amount);/*** 方法内会启动 1000 个线程&#xff0c;每个线程做 -10 元 的操作* 如果初始…

2024全国大学省数学建模竞赛C题-优秀论文分析(2023)

​某商超蔬菜类商品动态定价与补货决策研究 摘 要 随着生鲜市场规模的持续扩大&#xff0c;蔬菜零售行业的竞争也愈加激烈。为帮助某商超 改善经营模式&#xff0c;本文基于题目所给数据信息&#xff0c;建立数学模型进行分析&#xff0c;从而制定合理 的蔬菜类商品动态定价与…

ARM发布新一代高性能处理器N3

简介 就在2月21日&#xff0c;ARM发布了新一代面向服务器的高性能处理器N3和V3&#xff0c;N系列平衡性能和功耗&#xff0c;而V系列则注重更高的性能。此次发布的N3&#xff0c;单个die最高32核&#xff08;并加入到CCS&#xff0c;Compute Subsystems&#xff0c;包含Core&a…

C语言函数不同个数、大小形参对执行速度的影响:以Cortex-M3为例从汇编角度分析原因

0 资料&工具 Cortex M3权威指南(中文).pdf keil5&#xff08;用于仿真查看汇编代码、栈变化&#xff09;1 C语言函数不同个数、大小形参对执行速度的影响&#xff1a;以Cortex-M3为例从汇编角度分析原因 C语言中有条不成文的规定&#xff1a;不建议函数的形参数量超过4个…

C8T6超绝模块--LED

C8T6超绝模块–LED 大纲 怎样点亮LED结构体分析代码流程 具体案例 怎样点亮LED 首先不同的芯片的接法不一样&#xff0c;需要自己查看自己的芯片的原理图&#xff0c;我使用的是C8T6&#xff0c;使用的PC13接入的LED 注意看&#xff1a;怎么才能使LED灯亮呢&#xff1f; …

flux 文生图大模型 自有数据集 lora微调训练案例

参考: https://github.com/ostris/ai-toolkit 目前 Flux 出现了 3 个训练工具 SimpleTuner https://github.com/bghira/SimpleTuner X-LABS 的https://github.com/XLabs-AI/x-flux ai-toolkit https://github.com/ostris/ai-toolkit 待支持:https://github.com/kohya-ss/sd-s…

RK3588平台开发系列讲解(显示篇)MIPI详解

文章目录 一、DSI和CSI二、初识MIPI2.1、框架2.2、参数2.3、接口三、设备树下CSI的配置沉淀、分享、成长,让自己和他人都能有所收获!😄 一、DSI和CSI DSI( Display Serial Interface ) :位于处理器和显示模组之间的显示串行接口CSI( Camera Serial Interface ) : 位于…