当前位置: 首页 > 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;还会发生显示跳跃性卡顿的现象…...

利用快马平台快速构建mcporter数据转换工具原型,十分钟验证数据管道设计

最近在做一个数据迁移项目时&#xff0c;遇到了需要频繁转换数据格式的需求。传统方式下&#xff0c;光是搭建开发环境、编写基础代码就要花上大半天时间。这次尝试用InsCode(快马)平台快速构建了一个mcporter数据转换工具原型&#xff0c;整个过程出乎意料地顺畅。 明确核心需…...

SSHFS-Win许可证完全指南:GPLv2+、GPLv3与FLOSS异常条款解析

SSHFS-Win许可证完全指南&#xff1a;GPLv2、GPLv3与FLOSS异常条款解析 【免费下载链接】sshfs-win SSHFS For Windows 项目地址: https://gitcode.com/gh_mirrors/ss/sshfs-win SSHFS-Win是一个让Windows用户通过SSH协议挂载远程服务器目录的开源工具&#xff0c;其许可…...

Orleans分布式追踪终极指南:Jaeger与Zipkin深度对比分析

Orleans分布式追踪终极指南&#xff1a;Jaeger与Zipkin深度对比分析 【免费下载链接】orleans dotnet/orleans: Orleans是由微软研究团队创建的面向云应用和服务的分布式计算框架&#xff0c;特别适合构建虚拟 actor模型的服务端应用。Orleans通过管理actors生命周期和透明地处…...

AI智能体实战:从入门到企业级自动化应用

摘要 本文基于我过去一年多在企业级AI智能体落地的实战经验&#xff0c;从核心架构设计、从零到一的落地实战、生产环境踩坑避坑&#xff0c;到企业级进阶优化&#xff0c;完整拆解AI智能体从玩具Demo到生产级自动化应用的全流程。本文不搞空泛的理论堆砌&#xff0c;所有内容均…...

WPF图片处理避坑指南:Image控件Stretch属性的4种模式详解(含效果对比图)

WPF图片处理避坑指南&#xff1a;Image控件Stretch属性的4种模式详解 刚接触WPF开发的工程师们&#xff0c;是否经常遇到图片显示变形、比例失调的困扰&#xff1f;Image控件的Stretch属性看似简单&#xff0c;却藏着不少设计哲学。今天我们就来彻底拆解这个影响图片显示效果的…...

OctoLinker:突破跨平台代码导航壁垒,实现无缝开发体验

OctoLinker&#xff1a;突破跨平台代码导航壁垒&#xff0c;实现无缝开发体验 【免费下载链接】OctoLinker OctoLinker — Links together, what belongs together 项目地址: https://gitcode.com/gh_mirrors/oc/OctoLinker 跨平台开发中&#xff0c;开发者常常面临不同…...

深蓝词库转换:20+输入法词库互通的完整实战指南

深蓝词库转换&#xff1a;20输入法词库互通的完整实战指南 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 你是否曾在切换输入法时&#xff0c;为无法迁移多年积累的…...

2026最新Java金三银四面试参考指南公开!

想必有很多小伙伴这会已经在为金三银四面试跳槽做准备了。临近面试肯定是要想办法提升自己的面试能力&#xff0c;这个时候如果还去一昧地提升自己的代码能力对面试是毫无帮助的。大多数人在面试的时候都会遇到以下几种情况&#xff08;大家可以看看自己中了几个&#xff09;&a…...

中国空间智能,梦想照进现实

2026年初&#xff0c;AI教母李飞飞的AI公司World Labs再次获得一笔10亿美元的投资&#xff0c;投资名单除了传统投资机构外&#xff0c;还不乏英伟达、Autodesk等行业巨头&#xff0c;这清晰地传递出市场信号&#xff1a;继AI大语言模型之后&#xff0c;空间智能已成为AI的下一…...

PlugY:暗黑2单机玩家必备的生存工具包,开启无限可能游戏体验 [特殊字符]

PlugY&#xff1a;暗黑2单机玩家必备的生存工具包&#xff0c;开启无限可能游戏体验 &#x1f525; 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 还在为暗黑破坏神…...