से कनवर्ट करना अक्सर मुझे गणना से Option<String>
प्राप्त हुआ है, और मैं या तो इस मान या डिफ़ॉल्ट हार्डकोडेड मान का उपयोग करना चाहता हूं।विकल्प <String> से विकल्प <&str>
let opt: Option<String> = "some value".to_owned();
let value = opt.unwrap_or("default string");
सटीक यहाँ त्रुटि है:
let opt: Option<i32> = Some(3);
let value = opt.unwrap_or(0); // 0 being the default
लेकिन एक String
और एक &str
साथ, संकलक के बारे में बेमेल प्रकार की शिकायत है:
यह एक पूर्णांक के साथ तुच्छ होगा
error: mismatched types:
expected `collections::string::String`,
found `&'static str`
एक विकल्प स्ट्रिंग स्लाइस को एक में परिवर्तित करना है स्वामित्व वाली स्ट्रिंग:
let rx: Regex = Regex::new(&opt.unwrap_or("default string".to_owned()));
मैं नहीं बल्कि होगा:
let value = opt.unwrap_or("default string".to_owned());
लेकिन इस आवंटन, जो अवांछनीय है जब मैं तुरंत परिणाम Regex::new()
करने के लिए, एक स्ट्रिंग टुकड़ा करने के लिए वापस परिवर्तित करने के लिए इस कॉल में के रूप में चाहते हैं का कारण बनता है इस आवंटन से बचने के लिए Option<String>
को Option<&str>
में कनवर्ट करें।
इसे लिखने का मूर्ख तरीका क्या है?
bikesheddy टिप्पणी: 'map (| x | & ** x) के बजाय 'आप' मानचित्र (स्ट्रिंग :: as_ref) भी कर सकते हैं। – fjh
यह अच्छी तरह से काम करता है, हालांकि अभी भी एक छोटी verbose। स्पष्टीकरण के लिए, 'opt.as_ref() 'का प्रकार' विकल्प <&String> 'है, फिर' opt.as_ref()। नक्शा (स्ट्रिंग :: as_ref) 'इस' और स्ट्रिंग' को 'स्ट्रिंग :: as_ref' से गुजरता है, जो रिटर्न देता है एक 'और str'। 'विकल्प :: as_ref' से 'और स्ट्रिंग' को' और str' से क्यों नहीं जोड़ा जा सकता है? – thirtythreeforty
@thirtythreeforty 'स्ट्रिंग :: as_ref' एक '& str' देता है, न कि '&& स्ट्रिंग' (देखें [यहां] (http://doc.rust-lang.org/collections/string/struct.String.html#method। as_ref)) – fjh