Rust HashMap :当储物袋遇上物品清单

请添加图片描述

开场白:哈希映射的魔法本质

在Rust的奇幻世界里,HashMap就像魔法师的储物袋:

  • 键值对存储 → 每个物品都有专属咒语(键)和实体(值)
  • 快速查找 → 念咒瞬间召唤物品
  • 动态扩容 → 自动伸展的魔法空间
  • 所有权规则 → 严格的物品保管条例
use std::collections::HashMap;

let mut magic_pocket = HashMap::new(); // 打开新储物袋
magic_pocket.insert(String::from("🔥"), "火焰咒卷轴"); // 放入第一件宝物

第一章:基础操作三连击

1.1 物品收纳术(插入键值对)

场景类比:往魔法书里记录新咒语

let mut spell_book = HashMap::new();
spell_book.insert("💧".to_string(), "寒冰箭");  // 插入水元素咒语
spell_book.insert("🌪️".to_string(), "龙卷风"); // 插入风元素咒语

println!("{:?}", spell_book);
// 输出:{"💧": "寒冰箭", "🌪️": "龙卷风"}

魔法原理

  • insert像挥动魔杖把物品送入口袋
  • 键和值会被口袋接管所有权(String类型)
  • 重复插入相同键会触发覆盖效果

1.2 精准召唤术(获取值)

场景类比:用特定咒语召唤对应物品

let water_spell = spell_book.get("💧");      // 精确查找
let unknown_spell = spell_book.get("⚡");    // 查找不存在的咒语

println!("水咒语:{:?}", water_spell);    // Some("寒冰箭")
println!("雷咒语:{:?}", unknown_spell); // None

魔法原理

  • get方法返回Option<&V>类型
  • 返回的是不可变借用,物品仍属于口袋
  • 使用&str进行查找避免所有权转移

1.3 全物品扫描(遍历)

场景类比:清点魔法口袋所有物品

for (spell_symbol, spell_name) in &spell_book {
    println!("符咒{} => {}", spell_symbol, spell_name);
}
/* 输出:
符咒💧 => 寒冰箭
符咒🌪️ => 龙卷风
*/

魔法原理

  • 借用遍历避免转移所有权
  • 遍历顺序是随机的(魔法世界的混沌特性)

第二章:高级黑魔法(更新操作)

2.1 覆盖诅咒(直接覆盖)

场景类比:升级已有咒语

spell_book.insert("💧".to_string(), "极寒风暴"); // 覆盖原有咒语
println!("升级后:{:?}", spell_book.get("💧")); // Some("极寒风暴")

黑暗警示

  • 简单暴力但可能丢失重要数据
  • 适合需要强制更新的场景

2.2 条件封印(entry API)

场景类比:只有在没有对应咒语时才记录新咒语

spell_book.entry("⚡".to_string())
    .or_insert("雷电锁链"); // 因为⚡不存在,插入新咒语

spell_book.entry("💧".to_string())
    .or_insert("绝对零度"); // 💧已存在,不执行操作

println!("当前咒语表:{:?}", spell_book);
// ⚡被添加,💧保持"极寒风暴"

神谕指引

  • entry检查物品是否存在
  • or_insert只在空缺时执行
  • 避免无意义的覆盖

2.3 炼金合成(修改现有值)

场景类比:强化已有装备属性

let mut weapon_stats = HashMap::new();
weapon_stats.insert("圣剑", 100);

// 找到条目并强化
weapon_stats.entry("圣剑")
    .and_modify(|atk| *atk += 50)
    .or_insert(100);

println!("强化结果:{:?}", weapon_stats); // {"圣剑": 150}

炼金法则

  • and_modify允许修改现有值
  • 链式调用结合条件判断
  • 适合计数类场景

终章:综合大魔法——冒险者商店系统

use std::collections::HashMap;

fn main() {
    // 创建商店库存
    let mut shop_inventory = HashMap::new();
    
    // 初始化商品
    shop_inventory.insert("生命药水", 5);   // 5瓶库存
    shop_inventory.insert("魔法卷轴", 3);   // 3个库存
    
    // 玩家购买行为
    let purchase = vec!["生命药水", "魔法卷轴", "未知药剂"];
    
    for item in purchase {
        // 使用entry API更新库存
        shop_inventory.entry(item)
            .and_modify(|count| *count -= 1)
            .or_insert(0); // 处理不存在的商品
        
        println!("{}库存更新:", item);
        println!("当前库存状态:{:#?}", shop_inventory);
    }
    
    // 每日补货
    shop_inventory.insert("生命药水", 10); // 直接覆盖补货
    println!("\n=== 补货后库存 ===");
    for (item, count) in &shop_inventory {
        println!("{}:{}件", item, count);
    }
}

魔法水晶球显示:

生命药水库存更新:
当前库存状态:{
    "生命药水": 4,
    "魔法卷轴": 3,
}
魔法卷轴库存更新:
当前库存状态:{
    "生命药水": 4,
    "魔法卷轴": 2,
}
未知药剂库存更新:
当前库存状态:{
    "生命药水": 4,
    "魔法卷轴": 2,
    "未知药剂": 0,
}

=== 补货后库存 ===
生命药水:10件
魔法卷轴:2件
未知药剂:0件

魔法学院毕业手册

  1. 选择正确的钥匙 → 键类型需要实现EqHash特质
  2. 内存管理法则 → String作为键时会转移所有权
  3. 容量预言术 → 使用with_capacity预分配空间提升性能
  4. 防御性魔法 → 处理get返回的Option类型
  5. 时空旅行秘诀 → 遍历时借用避免所有权转移

记住:在Rust的魔法世界里,HashMap不是简单的储物袋,而是需要签订契约的次元空间。现在拿起你的法杖(键盘),去创造属于自己的哈希映射魔法吧!🎩✨

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW的智能电源远程监控系统开发

在工业自动化与测试领域&#xff0c;电源设备的精准控制与远程管理是保障系统稳定运行的核心需求。传统电源管理依赖本地手动操作&#xff0c;存在响应滞后、参数调节效率低、无法实时监控等问题。通过集成工业物联网&#xff08;IIoT&#xff09;技术&#xff0c;实现电源设备…

C# Winform制作一个登录系统

using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 登录 {p…

尝试把clang-tidy集成到AWTK项目

前言 项目经过一段时间的耕耘终于进入了团队开发阶段&#xff0c;期间出现了很多问题&#xff0c;其中一个就是开会讨论团队的代码风格规范&#xff0c;目前项目代码风格比较混乱&#xff0c;有的模块是驼峰&#xff0c;有的模块是匈牙利&#xff0c;后面经过讨论&#xff0c;…

Docker技术相关学习三

一、Docker镜像仓库管理 1.docker仓库&#xff1a;用于存储和分发docker镜像的集中式存储库&#xff0c;开发者可以将自己创建的镜像推送到仓库中也可以从仓库中拉取所需要的镜像。 2.docker仓库&#xff1a; 公有仓库&#xff08;docker hub&#xff09;&#xff1a;任何人都可…

挑战项目 --- 微服务编程测评系统(在线OJ系统)

一、前言 1.为什么要做项目 面试官要问项目&#xff0c;考察你到底是理论派还是实战派&#xff1f; 1.希望从你的项目中看到你的真实能力和对知识的灵活运用。 2.展示你在面对问题和需求时的思考方式及解决问题的能力。 3.面试官会就你项目提出一些问题&#xff0c;或扩展需求…

Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践

title: Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践 date: 2025/2/4 updated: 2025/2/4 author: cmdragon excerpt: PostgreSQL 作为开源关系型数据库的佼佼者,因其强大的功能与性能被广泛应用于各种项目中。而 Python 则因其简洁易用的语法、丰富的库和强大的…

计算机从何而来?计算技术将向何处发展?

计算机的前生&#xff1a;机械计算工具的演进 算盘是计算机的起点&#xff0c;它其实是一台“机械式半自动化运算器”。打算盘的“口诀”其实就是它的编程语言&#xff0c;算盘珠就是它的存储器。 第二阶段是可以做四则运算的加法器、乘法器。1642年&#xff0c;法国数学家帕斯…

【Blazor学习笔记】.NET Blazor学习笔记

我是大标题 我学习Blazor的顺序是基于Blazor University&#xff0c;然后实际内容不完全基于它&#xff0c;因为它的例子还是基于.NET Core 3.1做的&#xff0c;距离现在很遥远了。 截至本文撰写的时间&#xff0c;2025年&#xff0c;最新的.NET是.NET9了都&#xff0c;可能1…

MapReduce分区

目录 1. MapReduce分区1.1 哈希分区1.2 自定义分区 2. 成绩分组2.1 Map2.2 Partition2.3 Reduce 3. 代码和结果3.1 pom.xml中依赖配置3.2 工具类util3.3 GroupScores3.4 结果 参考 本文引用的Apache Hadoop源代码基于Apache许可证 2.0&#xff0c;详情请参阅 Apache许可证2.0。…

重生之我在异世界学编程之C语言:深入指针篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文&#xff08;1&#xff09;内置数…

deep generative model stanford lecture note3 --- latent variable

1 Introduction 自回归模型随着gpt的出现取得很大的成功&#xff0c;还是有很多工程上的问题并不是很适合使用自回归模型&#xff1a; 1&#xff09;自回归需要的算力太大&#xff0c;满足不了实时性要求&#xff1a;例如在自动驾驶的轨迹预测任务中&#xff0c;如果要用纯自回…

STM32_SD卡的SDIO通信_DMA读写

本篇&#xff0c;将使用CubeMXKeil&#xff0c;创建一个SD卡的DMA读写工程。 目录 一、简述 二、CubeMX 配置 SDIO DMA 三、Keil 编辑代码 四、实验效果 实现效果&#xff0c;如下图&#xff1a; 一、简述 上篇已简单介绍了SD、SDIO&#xff0c;本篇不再啰嗦&#xff0c;…

互联网行业常用12个数据分析指标和八大模型

本文目录 前言 一、互联网线上业务数据分析的12个指标 1. 用户数据&#xff08;4个&#xff09; (1) 存量&#xff08;DAU/MAU&#xff09; (2) 新增用户 (3) 健康程度&#xff08;留存率&#xff09; (4) 渠道来源 2. 用户行为数据&#xff08;4个&#xff09; (1) 次数/频率…

【学术投稿-2025年计算机视觉研究进展与应用国际学术会议 (ACVRA 2025)】从计算机基础到HTML开发:Web开发的第一步

会议官网&#xff1a;www.acvra.org 简介 2025年计算机视觉研究进展与应用&#xff08;ACVRA 2025&#xff09;将于2025年2月28-3月2日在中国广州召开&#xff0c;将汇聚世界各地的顶尖学者、研究人员和行业专家&#xff0c;聚焦计算机视觉领域的最新研究动态与应用成就。本次…

【Unity踩坑】Unity项目管理员权限问题(Unity is running as administrator )

问题描述&#xff1a; 使用Unity Hub打开或新建项目时会有下面的提示。 解决方法&#xff1a; 打开“本地安全策略”&#xff1a; 在Windows搜索栏中输入secpol.msc并回车&#xff0c;或者从“运行”对话框&#xff08;Win R&#xff0c;然后输入secpol.msc&#xff09;启…

开发板上Qt运行的环境变量的三条设置语句的详解

在终端中运行下面三句命令用于配置开发板上Qt运行的环境变量&#xff1a; export QT_QPA_GENERIC_PLUGINStslib:/dev/input/event1 export QT_QPA_PLATFORMlinuxfb:fb/dev/fb0 export QT_QPA_FONTDIR/usr/lib/fonts/设置成功后可以用下面的语句检查设置成功没有 echo $QT_QPA…

【PyQt】pyqt小案例实现简易文本编辑器

pyqt小案例实现简易文本编辑器 分析 实现了一个简单的文本编辑器&#xff0c;使用PyQt5框架构建。以下是代码的主要功能和特点&#xff1a; 主窗口类 (MyWindow): 继承自 QWidget 类。使用 .ui 文件加载用户界面布局。设置窗口标题、状态栏消息等。创建菜单栏及其子菜单项&…

Java 数据库连接池:HikariCP 与 Druid 的对比

Java 数据库连接池&#xff1a;HikariCP 与 Druid 的对比 数据库连接池&#xff1a;HikariCP 1. 卓越的性能表现 HikariCP 在数据库连接池领域以其卓越的性能脱颖而出。 其字节码经过精心优化&#xff0c;减少了不必要的开销&#xff0c;使得连接获取和释放的速度极快。 在…

PHP实现混合加密方式,提高加密的安全性(代码解密)

代码1&#xff1a; <?php // 需要加密的内容 $plaintext 授权服务器拒绝连接;// 1. AES加密部分 $aesKey openssl_random_pseudo_bytes(32); // 生成256位AES密钥 $iv openssl_random_pseudo_bytes(16); // 生成128位IV// AES加密&#xff08;CBC模式&#xff09…

Turing Complete-3位解码器

要求如下&#xff1a; 就是搭建一个3-8译码器 思路一&#xff1a; 使用四种判断来解决问题。 判断一&#xff1a;3个输入中是否有0个绿色。 解决办法&#xff1a;三个输入通过三输入或门再取反。 判断二&#xff1a;3个输入中是否有1个绿色&#xff0c;并确定是输入1、输入…