如何为Rust泛型函数中绑定的大小多的类型赋予可重用的名称

时间:2019-06-27 07:50:30

标签: generics rust

采用以下代码

fn do_stuff<T: ?Sized + io::Write + io::Read>(mut serial: Box<T>) {
  // stuff
}

例如,可能需要一个串行设备才能使用,或者可能需要一个文件来进行测试。这行得通,但是编写该类型绑定非常少。

如何给可以在其他函数中重用的界限命名?使用(按照Is there any way to create a type alias for multiple traits?

trait IoDev : io::Write + io::Read {}
impl<T: io::Write + io::Read> IoDev for T {}

部分解决了该问题,因为不再需要重复Write+Read,但是我仍然必须在每个函数上重复?Sized。有办法摆脱重复吗?

1 个答案:

答案 0 :(得分:0)

您的问题可能是特征没有自动实现。即使类型满足特征的所有先决条件,也必须手动为其编写impl。编译器不会自动执行此操作,因为实现特征可能会赋予它新的含义。

例如,std::iter::FusedIterator特性没有方法或关联的类型,唯一的要求是实现类型为Iterator。编译器不能自动实现它,因为它具有特殊含义,并且程序员必须决定是否应为特定的迭代器实现它。

如果要为满足条件的每种类型实现特征,则可以执行一揽子实现:

trait IoDev : io::Write + io::Read {}

impl<T: io::Write + io::Read> IoDev for T {}