Если вам не нужен этот шаблон, вы можете добавить еще один шаблон, чтобы он не отображался, с помощью оператора try (?
).См. Это подтверждение концепции:
#![feature(try_trait)]
use std::fmt;
use std::error::Error;
#[derive(Debug)]
struct MyError;
impl Error for MyError {
//
}
impl fmt::Display for MyError {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
write!(f, "MyError")
}
}
impl From<std::option::NoneError> for MyError {
fn from(_: std::option::NoneError) -> MyError {
MyError
}
}
impl<'a> From<&'a std::io::Error> for MyError {
fn from(_: &'a std::io::Error) -> MyError {
MyError
}
}
fn foo(i: &Result<Option<i32>, std::io::Error /* for example */>) -> Result<&i32, MyError> {
Ok(i.as_ref()?.as_ref()?)
}
К сожалению, я думаю, что вы не можете удалить вызовы as_ref
.