Как развернуть_или String
Когда используешь unwrap_or
как мне получить String
?
Я перевел мою проблему к этому (с большим количеством аннотаций типов, чем необходимо):
fn main() {
let mut blah: String;
let opt: Option<&str> = Some("foo");
blah = opt.unwrap_or("bar");
}
Это (разумно) говорит мне, что нам нужен String
не &str
,
error[E0308]: mismatched types
--> src/main.rs:33:12
|
33 | blah = opt.unwrap_or("bar");
| ^^^^^^^^^^^^^^^^^^^^ expected struct `std::string::String`, found &str
|
= note: expected type `std::string::String`
= note: found type `&str`
Поэтому я стараюсь предоставить желаемый тип.
blah = opt.unwrap_or("bar".to_string());
Но мне говорят:
error[E0308]: mismatched types
--> src/main.rs:33:26
|
33 | blah = opt.unwrap_or("bar".to_string());
| ^^^^^^^^^^^^^^^^^ expected &str, found struct `std::string::String`
|
= note: expected type `&str`
= note: found type `std::string::String`
error[E0308]: mismatched types
--> src/main.rs:33:12
|
33 | blah = opt.unwrap_or("bar".to_string());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `std::string::String`, found &str
|
= note: expected type `std::string::String`
= note: found type `&str`
1 ответ
Вы неправильно прочитали первую ошибку. Проблема не в типе, переданном в unwrap_or()
, но в типе, возвращаемом unwrap_or()
, Так как вы назначаете String
правая сторона задания также должна обеспечивать String
, Исходную ошибку можно исправить, просто добавив to_string()
после unwrap_or
:
let mut blah: String;
let opt: Option<&str> = Some("foo");
blah = opt.unwrap_or("bar").to_string();
Конечно, это также возможно для Option
содержать строку, и в этом случае ваша попытка исправить будет работать нормально:
let mut blah: String;
let opt: Option<String> = Some("foo".to_string());
blah = opt.unwrap_or("bar".to_string());
Обратите внимание, что аннотации типов не требуются ни в одной из переменных, вывод типа Rust достаточно умен, чтобы понять это самостоятельно.