你可以很容易地要求一个新接口满足 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>
,它在嵌入式环境中也不起作用,因为有时你没有堆。
有没有更好的方法来思考这个问题?使用单独的类型是唯一的方法吗?
“或”约束不是很有用(至少在 Rust 目前存在的情况下不是),因为在编写使用该约束的代码时,您无法依赖其中任何一个,并且没有“条件约束满足”的语法(也许将来会进行专业化)。
从字里行间可以看出,您最终想要为所有s 和所有s
Writer
工作。直接执行此操作的简单方法是:AsyncWriter
BlockingWriter
AsyncWriter
但这样做是行不通的,因为编译器会认为某物同时是和 的可能性存在冲突BlockingWriter
。我建议使用能够准确表达您所期望的作者类型的新型结构:
您必须使用
AsyncWriter
或BlockingWriter
像Writer
这些包装器一样包装网站,但它可以更清楚地表达您想要表达的内容以及它将如何进行书写。