Очень часто я получал 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'
Один из вариантов - преобразовать фрагмент строки в принадлежащую строку, как предполагает 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>
, чтобы избежать этого распределения.
Что за нелепый способ написать это?