Функция as_deref не меняет мой конкретный тип - PullRequest
0 голосов
/ 27 февраля 2020

Я хотел бы преобразовать Option<&String> в Option<&str> с as_deref(), но компилятор, похоже, неправильно понял мои намерения. Если я заменю его на .map(|e| e.as_str()), это сработает.

use std::collections::HashMap;

trait SipField {
    fn from(&self) -> Option<&str>;
}

impl SipField for HashMap<String, Vec<String>> {
    fn from(&self) -> Option<&str> {
        self.get("from")
            .or_else(|| self.get("f"))
            .and_then(|i| i.first())
            .as_deref()
    }
}
error[E0308]: mismatched types
  --> src/lib.rs:9:9
   |
9  | /         self.get("from")
10 | |             .or_else(|| self.get("f"))
11 | |             .and_then(|i| i.first())
12 | |             .as_deref()
   | |_______________________^ expected `str`, found struct `std::string::String`
   |
   = note: expected enum `std::option::Option<&str>`
              found enum `std::option::Option<&std::string::String>`
...