当前位置: 首页 > news >正文

研读Rust圣经解析——Rust learn-8(match,if-let简洁控制流,包管理)

研读Rust圣经解析——Rust learn-8(match,if-let简洁控制流,包管理)

  • match
    • other和占位符`_`
      • 区别
    • easy match
    • enum match
      • no value
      • match inner
    • Option match
      • more better way
  • if-let整洁控制
  • 包管理
    • 模块(mod)拆分
      • 声明mod
      • pub公开
      • use展开引用
      • 拆解模块
        • 结构
        • main.rs
        • lib.rs
        • lib/service.rs
        • lib/controller.rs

match

match用于对条件进行匹配以控制程序处理,对于enum十分有效或者是去用于Option

other和占位符_

在开始前,我们先来说以下other和占位符_,这常常在match的其余匹配中使用
比如:当周一的时候我要上课,周三的时候我要去钓鱼,而其他时间都得要上班,这时候使用other和占位符就很好,我只要处理周一和周三即可,其他都是相同的操作

区别

当我们不想使用通配模式获取的值时,请使用_,这是一个特殊的模式,可以匹配任意值而不绑定到该值

easy match

fn main() {let number = 46;match number {23=>println!("single"),46=>println!("double"),_=>()};}

另一种

fn main() {let number = 45;match number {23=>println!("single"),46=>println!("double"),other=>()};}

enum match

no value

没有任何值的时候我们可以直接去匹配enum的类型进行判断处理

enum Job {teacher,student,manager,
}fn main() {let job = Job::teacher;match job {Job::teacher => println!("teach student"),Job::student => println!("listen class"),Job::manager => println!("drink coffee"),}
}

match inner

但是如果我们的enum中嵌套结构体或者元组,我们可以使用{}|()匹配取出名称进行处理

enum Job {teacher,student,manager {name: Option<String>},
}fn main() {let job = Job::manager {name: Some("wangwu".to_string())};match job {Job::teacher => println!("teach student"),Job::student => println!("listen class"),Job::manager { name } => {println!("{}", name.unwrap());}}
}

Option match

我们可以对一个值是否为空进行匹配以进行处理

fn main() {let a = Some(5);let b = match a {Some(inner) => inner + 5,None => 10086};println!("{}", b);
}

more better way

更好的方式是:

fn main() {let a = Some(5);let b = match a {Some(inner) =>Ok( inner + 5),None =>Err("this is none")};println!("{}", b.unwrap());
}

这样把Option转为了Result进行处理

if-let整洁控制

实际上if-let就是if+let的结合模式,来处理只匹配一个模式的值而忽略其他模式的情况,若你只想处理一种情况,这比使用match更加好

fn main() {let a: Option<i32> = Some(100);if let Some(inner) = a {println!("{}", inner)}
}

包管理

以下是层级结构,我们需要记住

  1. 包(Packages):Cargo 的一个功能,它允许你构建、测试和分享 crate。
  2. Crates :一个模块的树形结构,它形成了库或二进制项目。
  3. 模块(Modules)和 use:允许你控制作用域和路径的私有性。
  4. 路径(path):一个命名例如结构体、函数或模块等项的方式

Rust不止能在一个main.rs中编写代码当然也支持import|export模式,而且也支持模块模式(想象成SpringCloud类的项目)

虽然圣经上描述的很具体,但是我认为我们只需要快速了解并学会使用即可

模块(mod)拆分

Rust把文件名直接名为一个模块名,引入文件=引入想应模块
接下来我们快速看一下mod说明

声明mod

这里我们声明了lib的mod,里面包含controller mod和service mod

mod lib{fn run_lib(){println!("lib")}mod controller{fn run_controller(){println!("controller")}}mod service{fn run_service(){println!("service")}}
}

但是实际上,外部无法调用这些内部模块和方法

pub公开

通过使用pub关键字,我们可以对方法、常量、结构体、枚举、模块等进行公开

pub mod lib{pub fn run_lib(){println!("lib")}pub mod controller{fn run_controller(){println!("controller")}}pub mod service{fn run_service(){println!("service")}}
}fn main() {lib::run_lib();
}

这样我们就能够访问到里面的模块和方法,但是依然无法访问到controller内部的和service内部的方法,因为没有被公开

use展开引用

通过使用use关键字,我们可以对内部可公开的引用直接使用,无需通过模块名称进行指定,这对于一些深模块是非常有用的

pub mod lib{pub fn run_lib(){println!("lib")}pub mod controller{pub fn run_controller(){println!("controller")}}pub mod service{pub fn run_service(){println!("service")}}
}use lib::controller::run_controller;fn main() {run_controller()
}

拆解模块

这里要说的真正的是拆解模块

pub mod lib{pub fn run_lib(){println!("lib")}pub mod controller{pub fn run_controller(){println!("controller")}}pub mod service{pub fn run_service(){println!("service")}}
}

现在我们有一个大模块,两个内部小模块
我们就应该在main.rs中创建一个lib.rs的文件存储lib模块中的内容
我们直接看结果或许会快很多

结构

在这里插入图片描述

main.rs

use ru2::lib::controller::run_controller;fn main() {run_controller();
}

lib.rs

pub mod lib{pub mod controller;pub mod service;
}
pub fn run_lib(){println!("lib")
}

lib/service.rs

pub fn run_service(){println!("service")
}

lib/controller.rs

pub fn run_controller(){println!("controller")
}

相关文章:

研读Rust圣经解析——Rust learn-8(match,if-let简洁控制流,包管理)

研读Rust圣经解析——Rust learn-8&#xff08;match,if-let简洁控制流&#xff0c;包管理&#xff09; matchother和占位符_区别 easy matchenum matchno valuematch inner Option matchmore better way if-let整洁控制包管理模块(mod)拆分声明modpub公开use展开引用拆解模块结…...

G8期刊《全体育》期刊简介及投稿要求

G8期刊《全体育》期刊简介及投稿要求 《全体育》是由湖南体育产业集团有限公司主管、体坛传媒集团股份有限公司主办、中教体育 出版发行的体育综合性期刊。 主管&#xff1a;湖南体育产业集团有限公司 主办&#xff1a;体坛传媒集团股份有限公司 国内刊号&#xff1a;CN4…...

数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)

目录 层序遍历 思路图解 代码实现 二叉树遍历的应用 输出二叉树中的叶节点 代码实现 求二叉树的高度 思路图解 代码实现 二元运算表达式树及其遍历 由两种遍历序列确定二叉树 层序遍历 层序遍历可以通过一个队列来实现&#xff0c;其基本过程为&#xff1a; 先根…...

【Neo4j数据库】图数据库_Neo4j增加节点(关系)、查询、删除数据库等操作解析(Cypher语句)

【Neo4j数据库】图数据库_Neo4j增加节点&#xff08;关系&#xff09;、查询、删除操作解析&#xff08;Cypher语句&#xff09; 文章目录 【Neo4j数据库】图数据库_Neo4j增加节点&#xff08;关系&#xff09;、查询、删除操作解析&#xff08;Cypher语句&#xff09;1. 介绍2…...

Linux移动文件和文件夹(目录)命令

命令mv 英文move 翻译移动 mv命令可以移动文件或文件夹&#xff08;目录&#xff09;&#xff0c;也可以重命令&#xff08;覆盖&#xff09;文件。 1. 移动文件/重命名 单纯地移动某一个文件直接使用&#xff1a; mv <源文件名称/地址> <新文件名称/地址>这个方法…...

Pandas的应用-5

Pandas是一个强大的数据处理库&#xff0c;它提供了高性能、易于使用的数据结构和数据分析工具。本文将介绍Pandas常用的数据结构和常用的数据分析技术&#xff0c;包括DataFrame的应用、窗口计算、相关性判定、Index的应用、范围索引、分类索引、多级索引以及日期时间索引。 …...

java继承类怎么写

继承类是通过把父类的方法和属性继承到一个类中&#xff0c;而子类的方法和属性是子类自己定义的。 Java中有一个很重要的概念叫做继承&#xff0c;这也是 Java语言的精髓所在。Java语言提供了一种机制&#xff0c;叫做派生类。在 Java中&#xff0c;如果没有实现了某个派生类方…...

面向对象程序设计

OOP 【面向对象程序设计】&#xff08;OOP&#xff09;与【面向过程程序设计】在思维方式上存在着很大的差别。【面向过程程序设计】中&#xff0c;算法是第一位的&#xff0c;数据结构是第二位的&#xff0c;这就明确地表述了程序员的工作方式。首先要确定如何操作数据&#…...

Linux 用户身份切换(su,sudo)

文章目录 Linux 用户身份切换su使用案例 sudo使用案例 visudo与/etc/sudoers单一用户可使用root所有命令&#xff0c;与sudoers文件语法利用wheel用户组以免密码的功能处理visudo有限制的命令操作通过别名创建visudosudo的时间间隔问题sudo搭配su的使用方式 Linux 用户身份切换…...

求倒置数问题

文章目录 求倒置数程序设计程序分析求倒置数 【问题描述】数组A【0,…,n-1】是一个n个不同整数数构成的数组。如果i<j,但是A[i]〉A[j],则这对元素(A[i],A[j])被称为一个倒置(inversion)。设计一个O(nlogn)算法来计算数组中的倒置数量 【输入形式】输入两行,第一行…...

sed(学习)

1、清除环境变量 ​​​​​​profile~/.bash_profile sed -i s#export LD_LIBRARY_PATH.*##g $profile 2、设置环境变量(替换值) sed -i s#export LD_LIBRARY_PATH.*#export LD_LIBRARY_PATH/opt/testlinux/lib#g ~/.bash_profile 3、修改配置文件 sdk_dir/root/test log_dir/…...

B - GCD Subtraction

文章目录 AtCoder Regular Contest 159B - GCD Subtraction AtCoder Regular Contest 159 B - GCD Subtraction 问题&#xff1a;每次A,B都减去gcd(A,B)&#xff0c;求其中一个减到0至少需要多少次主要思路&#xff1a; 首先第一步应该想到每次减去的数&#xff0c;先减去的数…...

解决Failed to load ApplicationContext问题的思路

中文翻译&#xff1a; 加载ApplicationContext失败 第一步&#xff1a;首先检查测试类的注解 以及 依赖 SpringBootTest <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scop…...

基于CAMX大气臭氧来源解析模拟与臭氧成因分析实践技术应用

查看原文>>>基于CAMX大气臭氧来源解析模拟与臭氧成因分析实践技术应用 目录 专题一、大气臭氧污染来源及成因分析技术讲解&#xff1b;CAMx模式初识及臭氧来源解析模拟本地案例配置说明 专题二、CAMx模式编译安装及空气质量模拟案例配置 专题三、CAMx扩展和探测工…...

异常的讲解 (1)

目录 异常入门的案例 异常介绍 基本概念 异常的小结 常见的运行时异常 1.NullPointerException空指针异常 2.ArithmeticException数学运算异常 3.ArraylndexOutOfBoundsException数组下标越界异常 4.ClassCastException类型转换异常 5.NumberFormatException数字格式不…...

Prometheus - Grafana 监控 MySQLD Linux服务器 demo版

目录 首先是下载Prometheus 下载和安装 配置Prometheus 查看监控数据 监控mysql demo 部署 mysqld_exporter 组件 配置 Prometheus 获取监控数据 -------------------------------------- 安装和使用Grafana 启动Grafana -------------------------------------- 配…...

应届生,实力已超6年,太卷了!

你好&#xff0c;我是田哥 今晚上&#xff0c;给一位朋友做模拟面试&#xff0c;原本说好的90分钟左右&#xff0c;结果整了2个多小时。 很多人估计也很好奇&#xff0c;我们这两个多小时聊聊什么&#xff0c;下面我给大致总结一下&#xff1a; 面试技巧 面试中&#xff0c;我们…...

0-1背包问题

文章目录 0-1背包问题JavaPython0-1背包问题 【问题描述】 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 【输入形式】 第一行输入物品的个数n和背包容量C。 第二行输入每个物品的价值v[i…...

VUE前端项目环境搭建

背景&#xff1a; 想要使用vue搭建一个前端项目&#xff0c;写个小网站练练手&#xff0c;因为没有前端经验&#xff0c;所以从网上找了一个vue得开源模板使用&#xff0c;经过一番挑选选中了字节公司花裤衩大佬开源得项目&#xff0c;地址如下&#xff1a; 开源项目地址&…...

VMware安装Win2000安装程序闪退重启等问题的解决方法

VMware安装Win2000安装程序闪退重启等问题的解决方法 【症状】 1、比较新的VMware版本如16.2.5&#xff0c;Win2000安装时&#xff0c;安装程序在安装Distributed Transaction Coordinator时闪退重启 2、比较新的VMware版本如17.0.1&#xff0c;还会发生显示跳跃性卡顿的现象…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...