Как вызвать метод черты для одного из двух Результатов, когда черта не безопасна для объекта? - PullRequest
0 голосов
/ 11 июня 2018

Я хочу, чтобы переменная model была либо Model1, либо Model2, в зависимости от фактической модели, закодированной в bytes.Как объединить две модели Result s, из которых только одна - Ok()?

let model1 = Model1::from_reader(&mut reader, &bytes);
let model2 = Model2::from_reader(&mut reader, &bytes);
let model = /* ??? */;
write_file(model).unwrap();

Они обе реализуют MessageWrite, что является единственной чертой, которая мне нужна с этого момента.Вот прототип для write_file()

fn write_file<M: MessageWrite>(msg: M) -> io::Result<()>

Я использую ящик быстрого прототипа для моделей.Прототип from_reader:

impl<'a> MessageRead<'a> for Model1<'a> {
    fn from_reader(r: &mut BytesReader, bytes: &'a [u8]) -> Result<Self> {
        // ...
    }
}

И черта MessageWrite.Обратите внимание, что это имеет Sized границы.

pub trait MessageWrite: Sized {
     // ...
}

1 Ответ

0 голосов
/ 11 июня 2018

Вы можете использовать сопоставление с образцом.Смотрите этот пример:

trait MessageWrite: Sized {}

struct Foo;
struct Bar;

impl MessageWrite for Foo {}
impl MessageWrite for Bar {}

fn main() {
    let f: Result<Foo, ()> = Ok(Foo{});
    let b: Result<Bar, ()> = Err(());

    match (f, b) {
        (Ok(f), _) => write_file(f),
        (_, Ok(b)) => write_file(b),
        _ => panic!(),
    };
}

fn write_file<M: MessageWrite>(msg: M) -> std::io::Result<()> { Ok(()) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...