Как реализовать From для преобразования одного типа Result в другой? - PullRequest
0 голосов
/ 30 июня 2019

Возможно ли общее преобразование Result<T, ErrorType1> в Result<T, ErrorType2>, если ErrorType2::From(ErrorType1) уже реализовано?Кажется, это должно быть возможно.

Это моя первая попытка, но она не компилируется.

impl<T> From<Result<T, LocalErrorType>> for Result<T, ForeignErrorType> {
    fn from<T>(res: Result<T, LocalErrorType>) -> Self {
        match sr {
            Ok(o) => Ok(o),
            Err(se) => Err(se.into())
        }
    }
}

, потому что:

  • From является иностранным признаком

  • Result<T, LocalErrorType> является иностранным типом, несмотря на то, что LocalErrorType является локальным типом

  • Result<T, ForeignErrorType>это также иностранный тип

Как мне этого добиться?

1 Ответ

2 голосов
/ 30 июня 2019

Один не реализует преобразования между двумя Result типами. Такое преобразование не требуется по двум причинам:

  1. Распространено и идиоматично реализовывать преобразования между типами ошибок вместо конкретного типа в более общий тип ошибки. Если ни один из этих двух типов не является более общим, чем другой, можно создать новый тип, который будет суммой обоих (то есть перечисление, где каждый вариант содержит отдельный тип ошибки). При этом преобразование результата так же просто, как использование map_err:

    let res: Result<_, LocalErrorType> = do_something();
    let res: Result<_, GenericErrorType> = res.map_err(From::from);
    
  2. Возможно, вам также не понадобится вызывать map_err, потому что оператор ? (или макрос try! до 1.13) уже преобразует тип ошибки, используя аналогичную процедуру ниже.

    fn do_something() -> Result<Foo, LocalErrorType> { unimplemented!() }
    
    fn foo() -> Result<(), GenericErrorType> {
        let stuff = do_something()?;
        Ok(())
    }
    

Смотри также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...