Анализ строки может вернуть любое количество типов :
pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err>
where
F: FromStr,
В вашем коде нет подсказок о , что следует проанализировать из строки перед тем, как вы начнете с ней связываться, поэтому компилятор не знает, какую реализацию parse
выбрать:
let addr = "127.0.0.1:23456".parse();
let addr = addr.map_err(|e| e.into())?;
Затем вы пытаетесь преобразовать неизвестный тип в MyError
, таким образом, возникает ошибка.
let addr = addr.map_err(|e: ::std::net::AddrParseError| e.into())?;
Знание типа error недостаточно, поскольку несколько типов могут реализовать FromStr
с одним и тем же типом ошибки:
pub trait FromStr {
type Err;
fn from_str(s: &str) -> Result<Self, Self::Err>;
}
Это означает, что компилятор все еще не знает, что анализировать.
В общем, компилятор не будет делать многократных шагов вывода, потому что пространство поиска может стать экспоненциально огромным. В других случаях нынешняя система черт ad hoc не знает достаточно / старается изо всех сил, чтобы заставить работать определенные типы вывода. Возможно, что переключение на мел сделает систему типов более математически строгой.
let addr = addr.map_err(|e| <MyError as From<_>>::from(e))?;
Это можно написать проще:
let addr = addr.map_err(|e| MyError::from(e))?;
Мне даже не нужно отображать ошибку
Да, потому что ?
делает это для вас.