我经常从计算中得到一个 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");
The exact error here is:
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>
来避免这种分配。
写这个的惯用方法是什么?