Rust में mutable HashMap में मान कैसे अपडेट करें: शुरुआती से विशेषज्ञ तक
\n\nक्या आपने कभी ऐसी स्थिति का सामना किया है जहाँ Rust में HashMap में मान अपडेट करना हो, लेकिन कंपाइलर आपके कोड को पास नहीं करने देता? यदि हाँ — तो आप अकेले नहीं हैं। Stack Overflow पर "How can I update a value in a mutable HashMap?" प्रश्न ने हज़ारों बार देखा गया है, और इसका मतलब है कि अनुभवी डेवलपर्स भी कभी-कभी इस संग्रह के साथ काम करने की बारीकियों में भ्रमित हो जाते हैं।
इस लेख में, हम Rust में HashMap में मान अपडेट करने के सभी तरीकों पर चर्चा करेंगे: बुनियादी insert से लेकर उन्नत entry().and_modify() तक। आप सीखेंगे कि डेटा को सही तरीके से कैसे बदलें, सामान्य गलतियों से कैसे बचें और मुहावरेदार कोड कैसे लिखें। चलिए शुरू करते हैं!
HashMap में अपडेट करना सिर्फ "लेकर बदल दिया" जैसा क्यों नहीं है?
\n\nकई भाषाओं के विपरीत, Rust आपको स्वामित्व और उधार के साथ स्पष्ट रूप से काम करने के लिए मजबूर करता है। जब आप HashMap में मान अपडेट करना चाहते हैं, तो आपको तीन कार्यों को हल करना होगा:
- \n
- कुंजी के अस्तित्व की जाँच करें — क्या पहले से कोई मान मौजूद है? \n
- मान बदलें — यदि कुंजी मौजूद है, तो उसे अपडेट करें \n
- नया डालें — यदि कुंजी नहीं है, तो उसे जोड़ें \n
सरल लगता है? आइए कोड देखें।
\n\nविधि 1: क्लासिक insert (लेकिन एक पेच के साथ)
\n\nसबसे सीधा तरीका insert का उपयोग करना है। यदि कुंजी मौजूद है तो यह मान को ओवरराइट करता है, या यदि कुंजी नहीं है तो एक नई जोड़ी डालता है।
use std::collections::HashMap;\n\nlet mut scores = HashMap::new();\nscores.insert(String::from("Alice"), 10);\nscores.insert(String::from("Bob"), 20);\n\n// Alice के लिए मान अपडेट करें\nscores.insert(String::from("Alice"), 15);\n\nprintln!("{:?}", scores); // {"Alice": 15, "Bob": 20}\n\nकाम करता है? हाँ। लेकिन एक बारीकी है: insert Option<V> लौटाता है — पुराना मान, यदि था। यह उपयोगी है यदि आप पिछला मान रखना चाहते हैं। लेकिन क्या होगा यदि आपको पुराने मान के आधार पर मान अपडेट करना हो? उदाहरण के लिए, स्कोर को 1 से बढ़ाना?
// Alice का स्कोर 1 से बढ़ाना चाहते हैं\nif let Some(score) = scores.get_mut("Alice") {\n *score += 1;\n}\n\nयह काम करता है, लेकिन दो ऑपरेशनों की आवश्यकता है: अस्तित्व की जाँच और बदलाव। और यदि कुंजी नहीं है? तो अलग से डालना होगा। बहुत सुंदर नहीं है।
\n\nविधि 2: Entry API — अपडेट का राजा
\n\nRust में एक शक्तिशाली उपकरण है — Entry API। यह एक ही अभिव्यक्ति में कुंजी के अस्तित्व की जाँच, मान अपडेट या डालने की अनुमति देता है। यह HashMap के साथ काम करने का मुहावरेदार तरीका है।
use std::collections::HashMap;\n\nlet mut word_count = HashMap::new();\n\n// वाक्य में शब्द गिनें\nfor word in "hello world hello Rust".split_whitespace() {\n let count = word_count.entry(word.to_string()).or_insert(0);\n *count += 1;\n}\n\nprintln!("{:?}", word_count);\n// {"hello": 2, "world": 1, "Rust": 1}\n\nजादू को समझते हैं:
\n- \n
entry(key)— कुंजी के लिए एक प्रविष्टि बनाता है \n or_insert(0)— यदि कुंजी नहीं है, तो मान 0 डालता है और उस पर एक परिवर्तनीय संदर्भ लौटाता है \n *count += 1— संदर्भ को डीरेफरेंस करता है और मान बढ़ाता है \n
वाह! एक पंक्ति — और हमने समस्या हल कर दी। लेकिन यह सब कुछ नहीं है।
\n\nविधि 3: and_modify — जब केवल अपडेट करना हो
\n\nक्या होगा यदि आप केवल तभी मान अपडेट करना चाहते हैं जब कुंजी मौजूद हो, और यदि नहीं है तो कुछ न करें? या कोई अन्य मान डालें? इसके लिए श्रृंखला में and_modify और or_insert हैं।
use std::collections::HashMap;\n\nlet mut inventory = HashMap::new();\ninventory.insert("apples".to_string(), 10);\ninventory.insert("bananas".to_string(), 5);\n\n// सेबों की संख्या 1 से बढ़ाएँ, यदि वे मौजूद हैं\ninventory.entry("apples".to_string())\n .and_modify(|