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

Rust 当trait不是对象安全的时,如何对两个结果之一调用trait方法?,rust,Rust,我希望变量model可以是Model1或Model2,具体取决于以字节编码的实际模型。如何合并两个模型结果s,其中只有一个是Ok() 它们都实现了MessageWrite,这是我从现在开始需要的唯一特性。这是write\u file()的原型 以及MessageWrite特性。请注意,is有一个大小的绑定 pub trait MessageWrite: Sized { // ... } 您可以使用模式匹配。请参见此示例: trait MessageWrite: Sized {} s

我希望变量
model
可以是
Model1
Model2
,具体取决于以
字节编码的实际模型。如何合并两个模型
结果
s,其中只有一个是
Ok()

它们都实现了
MessageWrite
,这是我从现在开始需要的唯一特性。这是
write\u file()的原型

以及
MessageWrite
特性。请注意,is有一个
大小的
绑定

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(()) }
trait MessageWrite:size{}
结构Foo;
结构杆;
为Foo{}执行impl MessageWrite
为条{}执行impl MessageWrite
fn main(){
设f:Result=Ok(Foo{});
设b:Result=Err(());
比赛(f,b){
(确定(f),)=>写入文件(f),
(u,Ok(b))=>写入_文件(b),
_=>恐慌!(),
};
}
fn write_文件(msg:M)->std::io::Result{Ok(())}

这就是我要找的!剩下的唯一问题是MessageWrite有一个
大小的
绑定,因此不能使用
Box::new()
创建对象。有解决办法吗?@junijl然后你可以直接打电话给
write\u file
谢谢,我更新了我的问题,希望现在问题更清楚是的,好多了。谢谢!:)
impl<'a> MessageRead<'a> for Model1<'a> {
    fn from_reader(r: &mut BytesReader, bytes: &'a [u8]) -> Result<Self> {
        // ...
    }
}
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(()) }