下面的例子是我能想到的最简单的例子,用来说明我正在努力实现的目标:
pub trait Recipient {
fn receive(&self, number: i32);
}
pub trait RecipientCatalog<R: Recipient> {
fn lookup<'a>(&self, recipient_index: usize) -> &'a R;
}
pub struct NumberDispatch<C>
where C: RecipientCatalog<R> {
catalog: C
}
impl<C> NumberDispatch<C>
where C: RecipientCatalog<R> {
pub fn dispatch(&self, number: i32) {
let recipient_index = 0; // Would be lookup logic
self.catalog.lookup(recipient_index).receive(number);
}
}
在示例中,NumberDispatch 应该能够将给定的数字分派给某个已解析的 Recipient 实现(查找逻辑对于示例并不重要)。但是,由于未定义类型“R”,因此此代码无法编译。但我不知道如何在 NumberDispatch 结构中定义 R 是什么。
这个想法是,API 用户将提供某种类型的 RecipientCatalog,该 RecipientCatalog 提供对实现 Recipient 特征的对象的引用。然后 NumberDispatch 应该能够通过在提供的 RecipientCatalog 实现中查找数字,将数字传递给某个已解析的 Recipient。
这意味着 NumberDispatch 定义了一个受限于 RecipientCatalog 实现的泛型。但由于 RecipientCatalog 还定义了一个受限于 Recipient 特征的泛型类型,我无法找到在 NumberDispatch 结构中定义它的方法。
有人知道是否可以做这样的事情以及如何做吗?
(编辑:忘记了特征中的&self)
如果它只能是一种类型,则使其成为关联类型:
我还删除了结构上的约束,因为你不应该把它们放在那里。