你可以很容易地要求一个新接口满足 A 和 B:
pub trait Writer: AsyncWriter + BlockingWriter {}
但是,我应该能够Writer
通过实现其中任何一个来满足接口。为此必须使用枚举很麻烦,因为我必须携带我不打算使用的选项的类型信息:
pub enum Writer<A: AsyncWriter, B: BlockingWriter> {
Async(A),
Blocking(B),
}
如果我想构造一个仅使用异步版本的编写器,我仍然必须传递有关阻塞编写器的类型信息。你可以聪明地使用以下命令从枚举中删除类型信息dyn
:
pub enum Writer<'async, 'blocking> {
Async(&'async dyn AsyncWriter),
Blocking(&'blocking dyn BlockingWriter),
}
问题是这只适用于对象安全特征,所以它不是完全万无一失的!同样的情况也适用于使用Box<dyn T>
,它在嵌入式环境中也不起作用,因为有时你没有堆。
有没有更好的方法来思考这个问题?使用单独的类型是唯一的方法吗?