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不是簡單的儲物袋,而是需要簽訂契約的次元空間。現在拿起你的法杖(鍵盤),去創造屬于自己的哈希映射魔法吧!🎩?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67955.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67955.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67955.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot統一異常攔截實踐指南

Spring Boot統一異常攔截實踐指南 一、為什么需要統一異常處理 在Web應用開發中&#xff0c;異常處理是保證系統健壯性和用戶體驗的重要環節。傳統開發模式中常見的痛點包括&#xff1a; 異常處理邏輯分散在各個Controller中錯誤響應格式不統一敏感異常信息直接暴露給客戶端…

使用 Elastic Cloud Hosted 優化長期數據保留:確保政府合規性和效率

作者&#xff1a;來自 Elastic Jennie Davidowitz 在數字時代&#xff0c;州和地方政府越來越多地承擔著管理大量數據的任務&#xff0c;同時確保遵守嚴格的監管要求。這些法規可能因司法管轄區而異&#xff0c;通常要求將數據保留較長時間 —— 有時從一年到七年不等。遵守刑事…

Oracle Primavera P6 最新版 v24.12 更新 2/2

目錄 一. 引言 二. P6 EPPM 更新內容 1. 用戶管理改進 2. 更輕松地標準化用戶設置 3. 摘要欄標簽匯總數據字段 4. 將里程碑和剩余最早開始日期拖到甘特圖上 5. 輕松訪問審計數據 6. 粘貼數據時排除安全代碼 7. 改進了狀態更新卡片視圖中的篩選功能 8. 直接從活動電子…

linux本地部署deepseek-R1模型

國產開源大模型追平甚至超越了CloseAI的o1模型&#xff0c;大國崛起時刻&#xff01;&#xff01;&#xff01; DeepSeek R1 本地部署指南 ??在人工智能技術飛速發展的今天&#xff0c;本地部署AI模型成為越來越多開發者和企業關注的焦點。本文將詳細介紹如何在本地部署DeepS…

C基礎寒假練習(2)

一、輸出3-100以內的完美數&#xff0c;(完美數&#xff1a;因子和(因子不包含自身)數本身 #include <stdio.h>// 函數聲明 int isPerfectNumber(int num);int main() {printf("3-100以內的完美數有:\n");for (int i 3; i < 100; i){if (isPerfectNumber…

有限元分析學習——Anasys Workbanch第一階段筆記梳理

第一階段筆記主要源自于嗶哩嗶哩《ANSYS-workbench 有限元分析應用基礎教程》 張曄 主要內容導圖&#xff1a; 筆記導航如下&#xff1a; Anasys Workbanch第一階段筆記(1)基本信息與結果解讀_有限元分析變形比例-CSDN博客 Anasys Workbanch第一階段筆記(2)網格單元與應力奇…

html基本結構和常見元素

html5文檔基本結構 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>文檔標題</title> </head> <body>文檔正文部分 </body> </html> html文檔可分為文檔頭和文檔體…

Cursor如何使用Google Gemini以及碰到的坑

Cursor如何使用Google Gemini以及碰到的坑 Cursor介紹下載安裝Google Gemini介紹Google Gemini 官網申請Google Gemini API網址 配置Cursor使用Google Gemini打開Corsur設置 Cursor介紹 ?Cursor是一款基于人工智能的代碼編輯器&#xff0c;旨在幫助開發者更高效地編寫代碼。?…

【云安全】云原生-K8S-簡介

K8S簡介 Kubernetes&#xff08;簡稱K8S&#xff09;是一種開源的容器編排平臺&#xff0c;用于管理容器化應用的部署、擴展和運維。它由Google于2014年開源并交給CNCF&#xff08;Cloud Native Computing Foundation&#xff09;維護。K8S通過提供自動化、靈活的功能&#xf…

【C++】線程池實現

目錄 一、線程池簡介線程池的核心組件實現步驟 二、C11實現線程池源碼 三、線程池源碼解析1. 成員變量2. 構造函數2.1 線程初始化2.2 工作線程邏輯 3. 任務提交(enqueue方法)3.1 方法簽名3.2 任務封裝3.3 任務入隊 4. 析構函數4.1 停機控制 5. 關鍵技術點解析5.1 完美轉發實現5…

深入理解 C# 與.NET 框架

.NET學習資料 .NET學習資料 .NET學習資料 一、引言 在現代軟件開發領域&#xff0c;C# 與.NET 框架是構建 Windows、Web、移動及云應用的強大工具。C# 作為一種面向對象的編程語言&#xff0c;而.NET 框架則是一個綜合性的開發平臺&#xff0c;它們緊密結合&#xff0c;為開…

雷電等基于VirtualBox的Android模擬器映射串口和測試CSerialPort串口功能

雷電等基于VirtualBox的Android模擬器映射串口和測試CSerialPort串口功能 1. 修改VirtualBox配置文件映射串口 模擬器配置文件vms/leidian0/leidian.vbox。 在UART標簽下增加(修改完成后需要將leidian.vbox修改為只讀) <Port slot"1" enabled"true"…

【Linux系統】SIGCHLD 信號(選學了解)

SIGCHLD 信號 使用wait和waitpid函數可以有效地清理僵尸進程。父進程可以選擇阻塞等待&#xff0c;直到子進程結束&#xff1b;或者采用非阻塞的方式&#xff0c;通過輪詢檢查是否有子進程需要被回收。 然而&#xff0c;無論是選擇阻塞等待還是非阻塞的輪詢方式&#xff0c;父…

【R語言】獲取數據

R語言自帶2種數據存儲格式&#xff1a;*.RData和*.rds。 這兩者的區別是&#xff1a;前者既可以存儲數據&#xff0c;也可以存儲當前工作空間中的所有變量&#xff0c;屬于非標準化存儲&#xff1b;后者僅用于存儲單個R對象&#xff0c;且存儲時可以創建標準化檔案&#xff0c…

Vim的基礎命令

移動光標 H(左) J(上) K(下) L(右) $ 表示移動到光標所在行的行尾&#xff0c; ^ 表示移動到光標所在行的行首的第一個非空白字符。 0 表示移動到光標所在行的行首。 W 光標向前跳轉一個單詞 w光標向前跳轉一個單詞 B光標向后跳轉一個單詞 b光標向后跳轉一個單詞 G 移動光標到…

11. 9 構建生產級聊天對話記憶系統:從架構設計到性能優化的全鏈路指南

構建生產級聊天對話記憶系統:從架構設計到性能優化的全鏈路指南 關鍵詞: 聊天對話記憶系統、多用戶會話管理、LangChain生產部署、Redis記憶存儲、高并發對話系統 一、服務級聊天記憶系統核心需求 多用戶隔離:支持同時處理數千個獨立對話持久化存儲:對話歷史不因服務重啟丟…

Block Blaster Online:免費解謎游戲的樂趣

Block Blaster Online 是一款免費的在線解謎游戲&#xff0c;它將挑戰你的思維和反應能力&#xff01;在這里&#xff0c;你可以匹配五彩繽紛的方塊&#xff0c;創造出令人驚嘆的組合&#xff0c;享受無盡的解謎樂趣。無需安裝&#xff0c;點擊即可開始&#xff0c;加入全球數百…

Guided Decoding (借助FSM,有限狀態自動機)

VLLM對結構化輸出的支持&#xff1a; vllm/docs/source/features/structured_outputs.md at main vllm-project/vllm GitHub VLLM對tool call的支持&#xff1a; vllm/docs/source/features/tool_calling.md at main vllm-project/vllm GitHub 以上指定輸出格式&#xf…

IFeatureWorkspace.CreateFeatureClass(),報錯對COM組件的調用返回了錯誤 HRESULT E_FAIL

1、問題描述&#xff1a;在AE開發中&#xff0c;新增一個空的shpfile文件的時候&#xff0c;報錯&#xff0c;如下圖&#xff1a; 2、原因分析&#xff1a;產生此問題的原因是未設置默認字段的默認參數&#xff0c;特別是未設置IGeometryDef 參數。 3、解決方案&#xff1a;在…

算法題(48):反轉鏈表

審題&#xff1a; 需要我們將鏈表反轉并返回頭結點地址 思路&#xff1a; 一般在面試中&#xff0c;涉及鏈表的題會主要考察鏈表的指向改變&#xff0c;所以一般不會允許我們改變節點val值。 這里是單向鏈表&#xff0c;如果要把指向反過來則需要同時知道前中后三個節點&#x…