Rust @绑定(Rust@绑定)(在模式匹配的同时将值绑定到变量)

news2024/11/14 22:28:18

文章目录

      • Rust中的`@`绑定
        • 基础概念
          • 示例:基本模式匹配
        • `@`绑定的使用
          • 示例:范围匹配并绑定变量
        • 深入探索`@`绑定的好处
          • 示例:复杂数据结构中的应用
        • 总结
      • 附加

Rust中的@绑定

Rust 语言以其强类型系统和内存安全的特性著称。在进行模式匹配时,Rust 提供了一系列强大的工具,其中@绑定是一个特别有用的特性,它允许在匹配模式的同时将值绑定到变量。本文将深入探讨@绑定的用法及其在Rust编程中的应用。

基础概念

在Rust中,模式匹配通常用于match表达式和某些if let语句中。模式匹配不仅仅是简单地检查一个值是否符合某个形式,更多的是可以在检查过程中抽取值或部分值。

示例:基本模式匹配
// 测试代码
#![allow(dead_code)] // 忽略全局dead code,放在模块开头!
#![allow(unused_variables)] // 忽略未使用变量,放在模块开头!

// #[derive(Debug)]

fn main() {
    enum Color {
        RGB(i32, i32, i32),
        HSV(i32, i32, i32),
    }

    let color = Color::RGB(122, 17, 40);

    match color {
        Color::RGB(r, g, b) => println!("Red: {}, Green: {}, Blue: {}", r, g, b),
        Color::HSV(h, s, v) => println!("Hue: {}, Saturation: {}, Value: {}", h, s, v),
    }
}

在这里插入图片描述

上述代码中,通过模式匹配不同的枚举变体,可以提取出各自的字段值。

@绑定的使用

@符号允许在执行模式匹配的同时,将匹配到的值绑定到一个新的变量。这对于需要在匹配某个范围或复杂模式的同时,还需要使用到该值的情况非常有用。

示例:范围匹配并绑定变量
// 测试代码
#![allow(dead_code)] // 忽略全局dead code,放在模块开头!
#![allow(unused_variables)] // 忽略未使用变量,放在模块开头!

// #[derive(Debug)]

fn main() {
    fn test_id(id: i32) {
        match id {
            e @ 1..=5 => println!("Early id: {}", e),
            l @ 6..=10 => println!("Later id: {}", l),
            _ => println!("Other id"),
        }
    }

    test_id(3);
    test_id(7);
}

在这里插入图片描述

在这个例子中,如果id的值落在15的范围内,不仅会匹配这个范围,还会将id的值绑定到变量e上。同样的,610的范围会绑定到变量l上。这样做可以直接在打印语句中使用这些变量。

深入探索@绑定的好处

使用@绑定的一个主要好处是它提供了代码的简洁性和灵活性。在需要对匹配到的值进一步操作时,这一特性尤其有用。比如,可以在模式匹配后直接对这些值进行计算或逻辑判断,而不需要再次解构或访问原始数据结构。

示例:复杂数据结构中的应用

假设有一个游戏中的角色状态描述枚举:

// 测试代码
#![allow(dead_code)] // 忽略全局dead code,放在模块开头!
#![allow(unused_variables)] // 忽略未使用变量,放在模块开头!

// #[derive(Debug)]

fn main() {
    enum CharacterState {
        Attacking { damage: i32, crit_chance: f32 },
        Defending { blocked: bool },
        Moving { speed: f32 },
    }

    let state = CharacterState::Attacking {
        damage: 30,
        crit_chance: 0.15,
    };

    match state {
        CharacterState::Attacking {
            damage,
            crit_chance: c @ 0.1..=0.2,
        } => {
            println!(
                "Attack with {} damage and {}% critical chance",
                damage,
                c * 100.0
            )
        }
        _ => println!("Other actions"),
    }
}

在这里插入图片描述

在这里插入图片描述

在这个例子中,当角色处于攻击状态且暴击几率在10%20%之间时,将暴击几率绑定到变量c并在输出中使用。这样的写法既清晰又直接,极大地提高了代码的可读性和维护性。

总结

@绑定是Rust模式匹配中一个非常强大的特性,它扩展了模式匹配的用途,使得在匹配过程中可以更灵活地处理数据。通过上述示例和解析,可以看到@绑定如何在实际编程中提供便利和效率,是Rust语言中不可或缺的一个工具。

附加

另外还有一些语法糖,以及@绑定新特性,可以参考文章:《Rust语言圣经》Rust教程笔记19:2.Rust基础入门(2.6模式匹配)2.6.4全模式列表(查询用)

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

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

相关文章

可靠UDP协议(KCP)使用说明

希望这篇文章&#xff0c;对学习和使用 KCP 协议的读者&#xff0c;有帮助。 1. KCPUDP 流程图 2. 示例代码&#xff08;待补充&#xff09; #include <iostream>int main() {// TODO: kcp examplereturn 0; }

《Python网络安全项目实战》项目4 编写网络扫描程序

《Python网络安全项目实战》项目4 编写网络扫描程序 项目4 编写网络扫描程序任务4.1 扫描内网有效IP地址任务描述任务分析任务实施任务拓展 任务4.2 编写端口扫描工具任务描述任务分析任务实施相关知识任务评价任务拓展项目评价 项目4 编写网络扫描程序 许多扫描工具是由Pytho…

CSS:导航栏三角箭头

用CSS实现导航流程图的样式。可根据自己的需求进行修改&#xff0c;代码精略的写了一下。 注&#xff1a;场景一和场景二在分辨率比较低的情况下会有一个1px的缝隙不太优雅&#xff0c;自行处理。有个方法是直接在每个外面包一个DIV&#xff0c;用动态样式设置底色。 场景一、…

【Python系列】浅析流式模式:基于 SSE 的实时响应体验

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Python3.11.9+selenium,选择证书用多线程+键盘enter解决

Python3.11.9+selenium,选择证书用多线程+键盘enter解决 1、遇到问题:弹出证书选择,无法点击确定 import pyautogui pyautogui.press(enter) 键盘enter也无法点击 2、解决办法:用多线程解决同时执行click链接和Enter点击证书的确定 1、点击操作 # # 通过文本链接文本…

前端开发快速进行 Mock 数据的方法

前端开发快速进行 Mock 数据的方法 在前端开发中&#xff0c;模拟数据&#xff08;Mock Data&#xff09;是不可或缺的一部分&#xff0c;它可以帮助开发者在没有后端接口的情况下快速推进项目进度。然而&#xff0c;在使用如 Mock.js 这样的工具时&#xff0c;开发者可能会遇…

Unity学习---IL2CPP打包时可能遇到的问题

写这篇主要是怕自己之后打包的时候出问题不知道怎么搞&#xff0c;所以记录一下。 问题一&#xff1a;类型裁剪 IL2CPP打包后会自动对Unity工程的dll进行裁剪&#xff0c;将代码中没有引用到的类型裁剪掉。特别是通过反射等方式调用一些类的时候&#xff0c;很容易出问题。 …

Unity学习笔记(4):人物和基本组件

文章目录 前言开发环境新增角色添加组件RigidBody 2D全局项目设置Edit 给地图添加碰撞体 总结 前言 今天不加班&#xff0c;有空闲时间。争取一天学一课&#xff0c;养成习惯 开发环境 Unity 6windows 11vs studio 2022Unity2022.2 最新教程《勇士传说》入门到进阶&#xff…

vue3使用element-plus,树组件el-tree增加引导线

vue3使用element-plus&#xff0c;树组件el-tree增加引导线 vue3项目element-plus&#xff0c;树组件el-tree增加引导线 element-plus组件库的el-tree样式 因为element的样式不满足当前的的需求&#xff0c;UI图&#xff0c;所以对el-tree进行增加了引导线 修改样式如下&am…

比ChatGPT更酷的AI工具

相较于寻找比ChatGPT更酷的AI工具&#xff0c;这听起来似乎是个挑战&#xff0c;因为ChatGPT已经以它强大的综合性能在AI界大名鼎鼎。然而&#xff0c;每个工具都有其独特的优势&#xff0c;特别是在特定的应用场景下&#xff0c;其他AI工具可能会展现出与ChatGPT不同的魅力。接…

微服务day08

Elasticsearch 需要安装elasticsearch和Kibana&#xff0c;应为Kibana中有一套控制台可以方便的进行操作。 安装elasticsearch 使用docker命令安装&#xff1a; docker run -d \ --name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \ //设置他的运行内存空间&#x…

微软推出的AI无代码编程微应用平台GitHub Spark和国产AI原生无代码工具CodeFlying比到底咋样?

今天咱来聊聊前阵子第十届GitHub开发者大会上发布的AI无代码编程平台GitHub Spark和国产的AI原生无代码工具CodeFlying比起来有没有什么说法。 首先说GitHub Spark这个产品截止到目前为止都很低调呀&#xff0c;甚至没有引起国外主流媒体的广泛关注。 有可能是因为大家都被…

设计模式:工厂方法模式和策略模式

工厂方法模式 什么是开闭原则? 开闭原则是扩展开发,对修改关闭 简单工厂(不是设计模式而是一种编程的习惯) 有三个角色 抽象产品:定义了产品的规范,描述了产品的特性和功能.具体产品:实现或者继承抽象产品的子类具体工厂:提供了创建产品的方法,调用者通过该方法获取产品 实…

docker:docker: Get https://registry-1.docker.io/v2/: net/http: request canceled

无数次的拉镜像让人崩溃&#xff1a; rootnode11:~/ragflow/docker# more rag.sh #export HTTP_PROXYhttp://192.168.207.127:7890 #export HTTPS_PROXYhttp://192.168.207.127:7890 #export NO_PROXYlocalhost,127.0.0.1,.aliyun.com docker compose -f docker-compose-gpu-C…

【珠海科技学院主办,暨南大学协办 | IEEE出版 | EI检索稳定 】2024年健康大数据与智能医疗国际会议(ICHIH 2024)

#IEEE出版|EI稳定检索#主讲嘉宾阵容强大&#xff01;多位外籍专家出席报告 2024健康大数据与智能医疗国际会议&#xff08;ICHIH 2024&#xff09;2024 International Conference on Health Big Data and Intelligent Healthcare 会议简介 2024健康大数据与智能医疗国际会议…

字符串处理指南:Air780E软件的全新视角

今天我会把 Air780E软件的字符串处理详细解析&#xff0c;指南如下&#xff1a; 1、Lua字符串介绍 关于字符串&#xff0c;Lua提供了一些灵活且强大的功能&#xff0c;一些入门知识如下&#xff1a; 1.1 字符串定义 在Lua中&#xff0c;字符串可以用单引号或双引号"来定…

【MySQL 保姆级教学】事务的隔离级别(详细)--下(13)

事务的隔离级别 1. 如何理解事务的隔离性2. 事务隔离级别的分类3. 查看和设置事务隔离级别3.1 全局和会话隔离级别3.2 查看和设置隔离级别 4. 事务隔离级别的演示4.1 读未提交&#xff08;Read Uncommitted&#xff09;4.2 读已提交&#xff08;Read Committed&#xff09;4.3 …

再见 阿里巴巴EasyExcel替代品EasyExcel-Plus即将诞生

最近阿里发布公告通知&#xff0c;停止对EasyExcel 更新和维护&#xff0c;EasyExcel 是一款知名的 Java Excel 工具库&#xff0c;由阿里巴巴开源&#xff0c;作者是玉霄&#xff0c;在 GitHub 上有 30k stars、7.5k forks。 据了解&#xff0c;EasyExcel作者玉霄)去年已经从…

Acrobat Pro DC 2023(pdf免费转化word)

所在位置 通过网盘分享的文件&#xff1a;Acrobat Pro DC 2023(64bit).tar 链接: https://pan.baidu.com/s/1_m8TT1rHTtp5YnU8F0QGXQ 提取码: 1234 --来自百度网盘超级会员v4的分享 安装流程 打开安装所在位置 进入安装程序 找到安装程序 进入后点击自定义安装&#xff0c;这里…

13载匠心独运,BI+AI启航新征程

13载匠心独运&#xff0c;BIAI启航新征程&#xff01; 思迈特的13年&#xff0c;是在坚守中持续创新&#xff0c;在创新中不断追求卓越&#xff0c;是在挑战与机遇并行中开创全新篇章的历程。感谢每一位陪伴走过这段旅程的人。展望未来&#xff0c;思迈特将继续以初心为舵、以…