采用以下代码
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
。有办法摆脱重复吗?
答案 0 :(得分:0)
您的问题可能是特征没有自动实现。即使类型满足特征的所有先决条件,也必须手动为其编写impl
。编译器不会自动执行此操作,因为实现特征可能会赋予它新的含义。
例如,std::iter::FusedIterator
特性没有方法或关联的类型,唯一的要求是实现类型为Iterator
。编译器不能自动实现它,因为它具有特殊含义,并且程序员必须决定是否应为特定的迭代器实现它。
如果要为满足条件的每种类型实现特征,则可以执行一揽子实现:
trait IoDev : io::Write + io::Read {}
impl<T: io::Write + io::Read> IoDev for T {}