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

news2024/10/7 8:22:35

研读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")
}

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

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

相关文章

docker cmd

sudo docker run --gpus all --name uavrl1 themvs/uav_swarm_reinforcement_learning sudo docker p s-a 86850d5a9dc3 sudo docker run --gpus all --name uavrl12 uavrl:v1.2 ---------- 共享屏幕输入类似指令&#xff0c;实测可行 sudo docker run -it --nethost --ipc…

Leetcode每日一题——“轮转数组”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是轮转数组&#xff0c;下面&#xff0c;让我们进入轮转数组的世界吧 小雅兰之前其实就已经写过了字符串旋转的问题了&#xff1a; C语言刷题&#xff08;7&#xff09;&#xff08;字符串旋转问题&#xff09…

优化 Kafka 的生产者和消费者

背景 如今&#xff0c;分布式架构已经成为事实上的架构模范&#xff0c;这使得通过 REST API 和 消息中间件来降低微服务之间的耦合变得必然。就消息中间件而言&#xff0c;Apache Kafka 已经普遍存在于如今的分布式系统中。Apache Kafka 是一个强大的、分布式的、备份的消息服…

HBase高手之路5—HBase的JavaAPI编程

文章目录Hbase高手之路5—Hbase的JavaAPI编程一、需求与数据集二、准备工作1.下载安装Java2.下载安装Idea3.下载安装maven4.Maven配置国内的镜像库5.Idea使用自定义的maven配置6.创建一个maven测试项目7.创建所需要的包8.创建类文件&#xff0c;输入代码9.运行项目三、创建HBas…

【2023 年第十三届 MathorCup 高校数学建模挑战赛】A 题 量子计算机在信用评分卡组合优化中的应用 详细建模过程解析及代码实现

更新信息&#xff1a;2023-4-15 更新了代码 【2023 年第十三届 MathorCup 高校数学建模挑战赛】A 题 量子计算机在信用评分卡组合优化中的应用 更新信息&#xff1a;2023-4-15 更新了代码 1 题目 在银行信用卡或相关的贷款等业务中&#xff0c;对客户授信之前&#xff0c;需…

Linux程序的内存

要研究程序的运行环境&#xff0c;首先要弄明白程序与内存的关系。程序与内存的关系&#xff0c;好比鱼和水一般密不可分。内存是承载程序运行的介质&#xff0c;也是程序进行各种运算和表达的场所。了解程序如何使用内存&#xff0c;对程序本身的理解&#xff0c;以及后续章节…

【CSS-Part3 样式显示模式、背景设置、三大特性 】

CSS-Part3 样式显示模式、背景设置、三大特性一 CSS元素显示模式&#xff1a;1.1块元素&#xff1a;1.2行内元素&#xff1a;1.3行内块元素&#xff1a;(同时具有行内元素和块元素的特点)元素显示模式总结&#xff1a;1.4元素显示模式转换&#xff1a;一种模式的元素需要另一模…

从Navicat 和 DBeaver中导出数据不要文本识别符号 “”

今天需要从MySQL和ClickHouse数据库中导出CSV数据文件&#xff0c;打开CSV数据文件后发现字段的数据带着""这种不需要的符号&#xff0c;研究了一下终于成功导出了不要文本识别符号“”的CSV文件 一、演示从DBeaver导出ClickHouse数据库的表文件 第一步&#xff0c…

SSH、OpenSSH、SSL、OpenSSL及CA

OpenSSL1. SSH、OpenSSH、SSL、OpenSSL关系及区别2. SSH介绍2.1 概念2.2 SSH的主要功能2.3 示例讲解2.4 ssh和sshd的区别3. OpenSSH介绍3.1 概念3.2 OpenSSH程序简介3.3 OpenSSH 包含的组件1. ssh2. scp3. sftp4. sshd5. ssh-keygen6. ssh-copy-id7. ssh-agent8. ssh-add9. ssh…

刘二大人《Pytorch深度学习实践》第九讲多分类问题

文章目录多分类问题损失函数课上代码transforms的使用方法view&#xff08;&#xff09;函数dim维度的理解为什么要使用item()多分类问题 把原来只有一个输出&#xff0c;加到10个 每个输出对应一个数字&#xff0c;这样可以得到每个数字对应的概率值&#xff0c;这里每个输出做…

Netty实战与调优

Netty实战与调优 聊天室业务介绍 代码参考 /*** 用户管理接口*/ public interface UserService {/*** 登录* param username 用户名* param password 密码* return 登录成功返回 true, 否则返回 false*/boolean login(String username, String password); }/*** 会话管理接口…

如何快速上手Vue框架?

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 运行环境&#xff1a;Google浏览器 Vue框架版本&#xff1a;Vue.js v2.7.14 目录一. 框架是什么&#xff1f;二. 怎么写一个Vue程序&#xff08;以IDEA举例&#xff09;&#xff1f;三. 什么是声明式渲染?3.1 声明式3.2 渲染四…

docker安装oracle_11g -- 命还长时,自己搞的小玩具!!!

前言: 如果不是嫌命长, 建议不这么玩, 因为装到最后你会很崩溃, 感觉毫无意义, 就是个玩具, 哎~~~就是玩!!! 参考文档 1.https://blog.51cto.com/u_12946336/5722259 2.https://www.muzhuangnet.com/show/118178.html 3.https://blog.csdn.net/qq_42957435/article/details/1…

spring security+jwt实现认证和授权

最近正在研究前后端分离的开发模式&#xff0c;做做小项目练练手&#xff0c;正好用到了spring security的认证和授权&#xff0c;就总结一波。 首先&#xff0c;引入相关的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId&g…

支付系统设计:收银台设计一

文章目录前言1. 收银台前端页面1. 1 收银台的业务场景1. 2 同应用不同支付场景下的收银台2. 商户平台配置管理2.1 配置流程2.2 支付工具列表配置2.3 支付配置2.3 支付银行配置3. 系统处理流程3.1 下单流程3.1 拉起收银台流程总结前言 收银台即用户日常付款前选择支付方式的页面…

革新设计,小巧强大,水库保卫无忧!

水库安全运行事关广大人民群众生命财产安全&#xff0c;为规范水库管理&#xff0c;落实水库预报、预警、预演、预案措施&#xff0c;提升水库信息化管理水平&#xff0c;保障水库安全运行。水库大坝是重要的国民基础设施&#xff0c;承担着防洪抗旱&#xff0c;节流发电的重要…

新规拉开中国生成式AI“百团大战”序幕?

AI将走向何方&#xff1f; ChatGPT在全球范围掀起的AI热潮正在引发越来越多的讨论&#xff0c;AI该如何管理&#xff1f;AI该如何发展&#xff1f;一系列问题都成为人们热议的焦点。此前&#xff0c;马斯克等海外名人就在网络上呼吁OpenAI暂停ChatGPT的模型训练和迭代&#xf…

SGAT丨单基因分析工具SingleGeneAnalysisTool

Single Gene Analysis Tool 简介&#xff1a;SGAT是一个免费开源的单基因分析工具&#xff0c;基于Linux系统实现自动化批量处理&#xff0c;能够快速准确的完成单基因和表型的关联分析&#xff0c;只需要输入基因型和表型原始数据&#xff0c;即可计算出显著关联的SNP位点&…

学习大数据需要什么语言基础

Python易学&#xff0c;人人都可以掌握&#xff0c;如果零基础入门数据开发行业的小伙伴&#xff0c;可以从Python语言入手。 Python语言简单易懂&#xff0c;适合零基础入门&#xff0c;在编程语言排名上升最快&#xff0c;能完成数据挖掘、机器学习、实时计算在内的各种大数…

测试名词介绍

测试名词介绍一&#xff1a;敏捷测试1. 定义&#xff1a;2. 敏捷测试的核心&#xff1a;3. 敏捷测试的8大原则和传统测试的区别二&#xff1a;测试名词介绍瀑布模型回归测试Alpha测试Beta测试性能测试白盒测试黑盒测试灰盒测试三&#xff1a;测试流程单元测试 (unit test)集成测…