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

embedded/2025/2/6 8:39:04/

请添加图片描述

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

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

  • 键值对存储 → 每个物品都有专属咒语(键)和实体(值)
  • 快速查找 → 念咒瞬间召唤物品
  • 动态扩容 → 自动伸展的魔法空间
  • 所有权规则 → 严格的物品保管条例
rust">use std::collections::HashMap;let mut magic_pocket = HashMap::new(); // 打开新储物袋
magic_pocket.insert(String::from("🔥"), "火焰咒卷轴"); // 放入第一件宝物

第一章:基础操作三连击

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

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

rust">let mut spell_book = HashMap::new();
spell_book.insert("💧".to_string(), "寒冰箭");  // 插入水元素咒语
spell_book.insert("🌪️".to_string(), "龙卷风"); // 插入风元素咒语println!("{:?}", spell_book);
// 输出:{"💧": "寒冰箭", "🌪️": "龙卷风"}

魔法原理

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

1.2 精准召唤术(获取值)

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

rust">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 全物品扫描(遍历)

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

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

魔法原理

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

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

2.1 覆盖诅咒(直接覆盖)

场景类比:升级已有咒语

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

黑暗警示

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

2.2 条件封印(entry API)

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

rust">spell_book.entry("⚡".to_string()).or_insert("雷电锁链"); // 因为⚡不存在,插入新咒语spell_book.entry("💧".to_string()).or_insert("绝对零度"); // 💧已存在,不执行操作println!("当前咒语表:{:?}", spell_book);
// ⚡被添加,💧保持"极寒风暴"

神谕指引

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

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

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

rust">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允许修改现有值
  • 链式调用结合条件判断
  • 适合计数类场景

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

rust">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不是简单的储物袋,而是需要签订契约的次元空间。现在拿起你的法杖(键盘),去创造属于自己的哈希映射魔法吧!🎩✨


http://www.ppmy.cn/embedded/159978.html

相关文章

Github 2025-02-01 开源项目月报 Top20

根据Github Trendings的统计,本月(2025-02-01统计)共有20个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目8TypeScript项目3Jupyter Notebook项目2Rust项目2HTML项目2C++项目1Ruby项目1JavaScript项目1Svelte项目1非开发语言项目1Go项目1Oll…

基于ArcGIS的SWAT模型+CENTURY模型模拟流域生态系统水-碳-氮耦合过程研究

流域是一个相对独立的自然地理单元&#xff0c;它是以水系为纽带&#xff0c;将系统内各自然地理要素连结成一个不可分割的整体。碳和氮是陆地生态系统中最重要的两种化学元素&#xff0c;而在流域系统内&#xff0c;水-碳-氮是相互联动、不可分割的耦合体。随着流域内人类活动…

11 3D变换模块(transform3d.rs)

transform3d.rs代码定义了一个名为 Transform3D 的 Rust 结构体&#xff0c;它用于表示一个3D变换矩阵。这个结构体是泛型的&#xff0c;包含三个类型参数&#xff1a;T、Src 和 Dst。其中&#xff0c;T 用于矩阵元素的数据类型&#xff0c;Src 和 Dst 用于表示变换的源和目标类…

Ruby 模块(Module)

Ruby 模块&#xff08;Module&#xff09; 引言 在Ruby编程语言中&#xff0c;模块&#xff08;Module&#xff09;是一种重要的组织代码的方式。它允许开发者将相关的方法和变量组合在一起&#xff0c;形成逻辑上的分组。模块在Ruby中扮演着类似于类和模块的角色&#xff0c…

JAVA学习-练习试用Java实现“读取一个大型CSV文件,并将其内容存储到内存中的数据结构(如ArrayList)中”

问题&#xff1a; 编写一个Java程序&#xff0c;读取一个大型CSV文件&#xff0c;并将其内容存储到内存中的数据结构&#xff08;如ArrayList&#xff09;中。 解答思路&#xff1a; 在Java中&#xff0c;读取大型CSV文件并将其内容存储到内存中的数据结构&#xff08;如ArrayL…

2 Flink 部署及启动

2 Flink 部署及启动 1. Flink 在 Yarn 上的部署架构2. 启动集群3. 模式一: yarn-session4. 模式二: yarn-cluster Flink 支持多种安装模式: 1.local&#xff08;本地&#xff09;——单机模式&#xff0c;一般不使用&#xff1b; 2.standalone——独立模式&#xff0c;Flink 自…

APO v1.3.0 更新:支持将第三方告警事件接入平台,统一关联分析告警事件

在 APO v1.3.0 版本中&#xff0c;我们引入了对第三方告警事件的全面支持&#xff0c;旨在为用户提供一个更为集成和高效的告警分析平台。此次更新允许用户将来自不同来源的告警信息统一接入APO平台&#xff0c;从而实现告警事件的集中管理和关联分析。 目前支持接入Prometheu…

从 HTTP/1.1 到 HTTP/3:如何影响网页加载速度与性能

一、前言 在最近使用Apipost时&#xff0c;突然注意到了http/1.1和http/2&#xff0c;如下图&#xff1a; 在我根深蒂固的记忆中&#xff0c;对于http的理解还停留在TCP协议、三次握手。由于我的好奇心&#xff0c;于是触发了我被动“开卷”&#xff0c;所以有了这篇文章&…