如何unwrap_or到String

Mar*_*ten 1 types rust unwrap

使用时unwrap_or,如何获得String

我已经将我的问题归结为此(使用更多类型注释而不是需要):

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

这(合理地)告诉我,我们需要一个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`
Run Code Online (Sandbox Code Playgroud)

所以我尝试提供想要的类型.

blah = opt.unwrap_or("bar".to_string());
Run Code Online (Sandbox Code Playgroud)

但我被告知:

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`
Run Code Online (Sandbox Code Playgroud)

use*_*342 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();
Run Code Online (Sandbox Code Playgroud)

当然也可以Option包含一个字符串,在这种情况下你的尝试修复可以正常工作:

let mut blah: String;
let opt: Option<String> = Some("foo".to_string());
blah = opt.unwrap_or("bar".to_string());
Run Code Online (Sandbox Code Playgroud)

请注意,在任一变量中都不需要类型注释,Rust的类型推断足够聪明,可以自行解决.