매우 자주 Option<String>
계산 에서을 얻었 으며이 값이나 기본 하드 코딩 된 값을 사용하고 싶습니다.
이것은 정수로 간단합니다.
let opt: Option<i32> = Some(3);
let value = opt.unwrap_or(0); // 0 being the default
그러나 a String
및 a &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`
한 가지 옵션은 rustc가 제안한대로 문자열 조각을 소유 된 문자열로 변환하는 것입니다.
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>
.
이것을 작성하는 idomatic 방법은 무엇입니까?
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("") };
.