Как развернуть_или 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 достаточно умен, чтобы понять это самостоятельно.

Другие вопросы по тегам