बहुत बार मैंने Option<String>
एक गणना से प्राप्त किया है , और मैं या तो इस मूल्य या एक डिफ़ॉल्ट हार्डकोडेड मूल्य का उपयोग करना चाहूंगा।
यह पूर्णांक के साथ तुच्छ होगा:
let opt: Option<i32> = Some(3);
let value = opt.unwrap_or(0); // 0 being the default
लेकिन एक String
और एक के साथ &str
, कंपाइलर बेमेल प्रकारों के बारे में शिकायत करता है:
let opt: Option<String> = Some("some value".to_owned());
let value = opt.unwrap_or("default string");
यहाँ सटीक त्रुटि है:
error[E0308]: mismatched types
--> src/main.rs:4:31
|
4 | let value = opt.unwrap_or("default string");
| ^^^^^^^^^^^^^^^^
| |
| expected struct `std::string::String`, found reference
| help: try using a conversion method: `"default string".to_string()`
|
= note: expected type `std::string::String`
found type `&'static str`
एक विकल्प यह है कि स्ट्रिंग स्लाइस को एक स्वामित्व वाली स्ट्रिंग में परिवर्तित किया जाए, जैसा कि सरसराहट द्वारा सुझाया गया है:
let value = opt.unwrap_or("default string".to_string());
लेकिन यह एक आवंटन का कारण बनता है, जो अवांछनीय है जब मैं तुरंत परिणाम को एक स्ट्रिंग स्लाइस में बदलना चाहता हूं, जैसा कि इस कॉल में Regex::new()
:
let rx: Regex = Regex::new(&opt.unwrap_or("default string".to_string()));
मैं इस आवंटन से बचने के Option<String>
लिए एक में परिवर्तित करूंगा Option<&str>
।
इसको लिखने का मुहावरेदार तरीका क्या है?
map
नहीं किया गया। मुझे समझ में नहीं आ रहा हैOptions<String>
किas_deref
कोड के वैरिएंट के मामले में पहली और प्रतिलिपि का क्या होता है । यहां मेरा काम करने वाला कोड हैas_deref
:let device_id = UsbDeviceIdentifier::VidPidSn { vid: device.vendor_id, pid: device.product_id, sn: device.serial_number.as_deref().unwrap_or("") };
और मेरी पहली कोशिशlet device_id = UsbDeviceIdentifier::VidPidSn { vid: device.vendor_id, pid: device.product_id, sn: device.serial_number.map(|s| s.as_str()).unwrap_or("") };
।