经常情况下,我从计算中获取一个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`
一种选项是将字符串切片转换为拥有所有权的字符串(即 String),正如 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>
,以避免此分配。
写这个的惯用方式是什么?
"default string".to_string())
可能是正确的解决方案,因为它使你的代码易于理解,这比节省100 ns的CPU时间或100字节的内存更重要。 - FreelanceConsultant