2

使用时unwrap_or,如何获得String

我已经把我的问题提炼成这个(类型注释比需要的多):

fn main() {
    let mut blah: String;
    let opt: Option<&str> = Some("foo");
    blah = opt.unwrap_or("bar");
}

这(合理地)告诉我我们需要 aString而不是 a &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`
4

1 回答 1

7

您误读了第一个错误。问题不在于传递给 的类型unwrap_or(),而在于返回的类型unwrap_or()。由于您要分配给 a String,因此分配的右侧也必须提供 a 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 的类型推断足够聪明,可以自己弄清楚。

于 2016-12-04T11:58:26.400 回答