当特征不是对象安全的时,如何对两个结果之一调用特征方法?



我希望变量modelModel1Model2,具体取决于bytes编码的实际模型。如何合并两个模型Result,其中只有一个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 {
// ...
}

您可以使用模式匹配。请参阅此示例:

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(()) }

最新更新