Как связать связанный тип для работы с оператором `?`? - PullRequest
1 голос
/ 16 апреля 2020

Учитывая следующее Rust:

struct E;

trait Fallible {
    type Error: Into<E>;
    fn e(&self) -> Result<(), Self::Error>;
}

fn test(f: &impl Fallible) -> Result<(), E> {
    Ok(f.e()?)
}

Я пытаюсь express, чтобы тип Fallible::Error мог быть преобразован в E и, следовательно, должен использоваться с оператором ?. Но по какой-то причине ? основан на черте From, которую я не уверен, что ее можно ограничить.

В настоящее время это не удается с:

error[E0277]: `?` couldn't convert the error to `E`
 --> src/lib.rs:9:13
  |
9 |     Ok(f.e()?)
  |             ^ the trait `std::convert::From<<impl Fallible as Fallible>::Error>` is not implemented for `E`
  |
  = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait
  = note: required by `std::convert::From::from`

1 Ответ

1 голос
/ 16 апреля 2020

Пока вы не можете связать на уровне черты , пока , вы можете сделать это с помощью функции:

struct E;

trait Fallible {
    type Error: Into<E>;
    fn e(&self) -> Result<(), Self::Error>;
}

fn test<T>(f: &T) -> Result<(), E>
where
    T: Faillible,
    E: From<T::Error>,
{
    Ok(f.e()?)
}
...