研读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)}
}
包管理
以下是层级结构,我们需要记住
- 包(Packages):Cargo 的一个功能,它允许你构建、测试和分享 crate。
- Crates :一个模块的树形结构,它形成了库或二进制项目。
- 模块(Modules)和 use:允许你控制作用域和路径的私有性。
- 路径(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(match,if-let简洁控制流,包管理) matchother和占位符_区别 easy matchenum matchno valuematch inner Option matchmore better way if-let整洁控制包管理模块(mod)拆分声明modpub公开use展开引用拆解模块结…...
G8期刊《全体育》期刊简介及投稿要求
G8期刊《全体育》期刊简介及投稿要求 《全体育》是由湖南体育产业集团有限公司主管、体坛传媒集团股份有限公司主办、中教体育 出版发行的体育综合性期刊。 主管:湖南体育产业集团有限公司 主办:体坛传媒集团股份有限公司 国内刊号:CN4…...
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
目录 层序遍历 思路图解 代码实现 二叉树遍历的应用 输出二叉树中的叶节点 代码实现 求二叉树的高度 思路图解 代码实现 二元运算表达式树及其遍历 由两种遍历序列确定二叉树 层序遍历 层序遍历可以通过一个队列来实现,其基本过程为: 先根…...
【Neo4j数据库】图数据库_Neo4j增加节点(关系)、查询、删除数据库等操作解析(Cypher语句)
【Neo4j数据库】图数据库_Neo4j增加节点(关系)、查询、删除操作解析(Cypher语句) 文章目录 【Neo4j数据库】图数据库_Neo4j增加节点(关系)、查询、删除操作解析(Cypher语句)1. 介绍2…...
Linux移动文件和文件夹(目录)命令
命令mv 英文move 翻译移动 mv命令可以移动文件或文件夹(目录),也可以重命令(覆盖)文件。 1. 移动文件/重命名 单纯地移动某一个文件直接使用: mv <源文件名称/地址> <新文件名称/地址>这个方法…...
Pandas的应用-5
Pandas是一个强大的数据处理库,它提供了高性能、易于使用的数据结构和数据分析工具。本文将介绍Pandas常用的数据结构和常用的数据分析技术,包括DataFrame的应用、窗口计算、相关性判定、Index的应用、范围索引、分类索引、多级索引以及日期时间索引。 …...
java继承类怎么写
继承类是通过把父类的方法和属性继承到一个类中,而子类的方法和属性是子类自己定义的。 Java中有一个很重要的概念叫做继承,这也是 Java语言的精髓所在。Java语言提供了一种机制,叫做派生类。在 Java中,如果没有实现了某个派生类方…...
面向对象程序设计
OOP 【面向对象程序设计】(OOP)与【面向过程程序设计】在思维方式上存在着很大的差别。【面向过程程序设计】中,算法是第一位的,数据结构是第二位的,这就明确地表述了程序员的工作方式。首先要确定如何操作数据&#…...
Linux 用户身份切换(su,sudo)
文章目录 Linux 用户身份切换su使用案例 sudo使用案例 visudo与/etc/sudoers单一用户可使用root所有命令,与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 问题:每次A,B都减去gcd(A,B),求其中一个减到0至少需要多少次主要思路: 首先第一步应该想到每次减去的数,先减去的数…...
解决Failed to load ApplicationContext问题的思路
中文翻译: 加载ApplicationContext失败 第一步:首先检查测试类的注解 以及 依赖 SpringBootTest <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scop…...
基于CAMX大气臭氧来源解析模拟与臭氧成因分析实践技术应用
查看原文>>>基于CAMX大气臭氧来源解析模拟与臭氧成因分析实践技术应用 目录 专题一、大气臭氧污染来源及成因分析技术讲解;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年,太卷了!
你好,我是田哥 今晚上,给一位朋友做模拟面试,原本说好的90分钟左右,结果整了2个多小时。 很多人估计也很好奇,我们这两个多小时聊聊什么,下面我给大致总结一下: 面试技巧 面试中,我们…...
0-1背包问题
文章目录 0-1背包问题JavaPython0-1背包问题 【问题描述】 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 【输入形式】 第一行输入物品的个数n和背包容量C。 第二行输入每个物品的价值v[i…...
VUE前端项目环境搭建
背景: 想要使用vue搭建一个前端项目,写个小网站练练手,因为没有前端经验,所以从网上找了一个vue得开源模板使用,经过一番挑选选中了字节公司花裤衩大佬开源得项目,地址如下: 开源项目地址&…...
VMware安装Win2000安装程序闪退重启等问题的解决方法
VMware安装Win2000安装程序闪退重启等问题的解决方法 【症状】 1、比较新的VMware版本如16.2.5,Win2000安装时,安装程序在安装Distributed Transaction Coordinator时闪退重启 2、比较新的VMware版本如17.0.1,还会发生显示跳跃性卡顿的现象…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
