2014-10-12 3 views
8

जंग में हैशप स्ट्रिंग करने के लिए मैं idiomatically स्ट्रिंग कैसे बनाऊंगा। निम्नलिखित कार्य करता है, लेकिन क्या यह सही तरीका है? क्या मुझे एक अलग तरह की स्ट्रिंग का उपयोग करना चाहिए?जंग में हैशमैप स्ट्रिंग करने के लिए मैं स्ट्रिंग कैसे बनाऊंगा और उपयोग करूं?

use std::collections::hashmap::HashMap; 
//use std::str; 
fn main() { 
     let mut mymap = HashMap::new(); 
     mymap.insert("foo".to_string(), "bar".to_string()); 
     println!("{0}", mymap["foo".to_string()]); 
} 
+1

यह स्वामित्व तार होने की जरूरत है? क्या आप इसे 'और' स्थिर स्ट्र '(स्ट्रिंग अक्षर) के साथ कर सकते हैं, खासकर चाबियों के लिए? –

उत्तर

10

मान लिया जाये कि आप String का लचीलापन चाहते हैं, HashMap<String, String> सही है। अन्य विकल्प &str है, लेकिन यह HashMap का उपयोग किया जा सकता है/जहां इसे चारों ओर पारित किया जा सकता है, इस पर महत्वपूर्ण प्रतिबंध लगाता है; लेकिन अगर यह काम करता है, तो &str पर एक या दोनों पैरामीटर बदलना अधिक कुशल होगा। इस विकल्प को निर्धारित किया जाना चाहिए कि आपको किस तरह के स्वामित्व सेमेन्टिक्स की आवश्यकता है, और स्ट्रिंग्स कितनी गतिशील हैं, this answer और the strings guide और देखें।

Btw, खोज एक String के साथ एक HashMap<String, ...> महंगा हो सकता है: यदि आप पहले से ही एक नहीं है, यह एक नई String आवंटन की आवश्यकता है।

use std::collections::HashMap; 
fn main() { 
    let mut mymap = HashMap::new(); 
    mymap.insert("foo".to_string(), "bar".to_string()); 
    println!("{}", mymap.find_equiv(&"foo")); 
    println!("{}", mymap.find_equiv(&"not there")); 
} 

playpen (ध्यान दें मैं Option छोड़ दिया है: हम एक काम के लिए एक नया String आवंटन के बिना (, किसी भी &str और अधिक सामान्य रूप) find_equiv का रूप है, जो आप एक स्ट्रिंग शाब्दिक पारित करने के लिए अनुमति देता है में चारों ओर है वापसी मूल्य में, कोई .unwrap() पर कॉल कर सकता है या एक लापता कुंजी को ठीक से संभाल सकता है)।

एक और थोड़ा अलग विकल्प (कुछ परिस्थितियों में अधिक सामान्य है, दूसरों में कम), (the name suggests के रूप में) का आवंटन बिना, std::string::as_string समारोह है, जो &str में डेटा देखने की अनुमति देता जैसे कि यह एक &String थे। यह एक ऑब्जेक्ट देता है जिसे String पर संदर्भित किया जा सकता है, उदा।

use std::collections::HashMap; 
use std::string; 

fn main() { 
    let mut mymap = HashMap::new(); 
    mymap.insert("foo".to_string(), "bar".to_string()); 
    println!("{}", mymap[*string::as_string("foo")]); 
} 

playpen

(एक समान std::vec::as_vec नहीं है।)

+0

[शायद हो सकता है '] (http://doc.rust-lang.org/std/str/enum.MaybeOwned.html) यहां कुछ लचीलापन की अनुमति दे सकता है? ऐसा लगता है कि इसे कुंजी के रूप में इस्तेमाल किया जा सकता है? –

+0

@MaththieuM यह एक और दृष्टिकोण है, हाँ। – huon

+1

मैं इसे 'find_equiv() 'लेता हूं अब आवश्यक नहीं है? आपका प्लेपेन उदाहरण अब संकलित नहीं होता है, और मुझे 'हैश मैप' पर 'find_equiv' विधि दिखाई नहीं दे रही है। – dimo414

संबंधित मुद्दे