实现可选的特征要求

时间:2021-03-25 05:04:58

标签: rust

我试图找到一种方法来对不同的特征进行分组,以便通用变量可以保存这些特征。

例如,我试图让 T 具有 io::Read + io::Write + io::Seek 的特征。 现在,可以使用以下代码在 Rust 中轻松完成:

pub trait RWS:  io::Read + io::Write + io::Seek{}
impl<T> RWS for T where T: io::Read + io::Write  + io::Seek{}

然而,当试图拥有一个接受 BufReader 的函数时,问题就来了,因为 BufReader 没有实现 io::Write。

因此, 是否有可能为可以是任一类型的通用类型实现如下所示的内容?

pub trait RWS:  io::Read || io::Write || io::Seek{}
impl<T> RWS for T where T: io::Read || io::Write  || io::Seek{}

1 个答案:

答案 0 :(得分:1)

如果您只需要一个字段可以一次存储实现这三个特征之一的任何内容,我建议使用一个简单的枚举:

enum RWS<'a> { // The lifetime parameter can be omitted if you will only be storing fields of `'static` type.
    Read(Box<dyn Read + 'a>),
    Write(Box<dyn Write + 'a>),
    Seek(Box<dyn Seek + 'a>),
}

为了方便起见,您可以向该枚举添加 from_readfrom_writefrom_seek 构造函数,并在结构的方法中对其进行匹配。

但是,这种方法有一些限制。由于它获得值的所有权并删除其具体类型,因此您不能执行以下操作:

let bufreader: std::io::BufReader = /* ... */;
self.rws = RWS::Read(Box::new(bufreader));
// later...
if let self.rws = RWS::Read(val) {
    self.rws = RWS::Seek(val); // compile error, even though `BufReader` impls `Seek`
} 
相关问题