如何具有动态的泛型类型或具有关联类型的动态特性?

时间:2019-03-27 18:29:05

标签: generics rust

是否可以省略或传递某些“任何”类型?

我希望能够定义一个“队列”,该“队列”可以通过注册用于不同作业的处理器来使用。类似于Node的how bull queue

队列不必关心处理器上的<P, R>泛型。它唯一的工作就是排队一个工作,获取该工作的处理器(与注册该处理器的“名称”相关联)并将该工作转发给它。

但是,processors结构上的Queue属性需要一些通用类型来传递给它。我试图通过使用特质来解决这个问题,但我有点退缩。

我想我正在尝试模仿TypeScript any类型。

我已经看到建议使用一个枚举来指定不同的工作类型;但是,这会使创建可重复使用的队列imo的处理器复杂化。

如果要执行此操作,则除了让用户仅注册其他处理器外,他们还必须注册它们并修改新作业类型的枚举。此外,由于作业是根据关联的处理器进行匹配的,因此模式匹配将无济于事。

dyn特质似乎是我想要的。但是,当特征具有关联类型时,我看不到它如何工作。

#[derive(Debug)]
struct JobOptions {}

#[allow(unused)]
#[derive(Debug)]
struct Job<P, R> {
    processor: String,
    payload: Box<P>,
    response: Option<Box<R>>,
    options: Option<JobOptions>,
    status: JobStatus,
}

#[allow(unused)]
struct Processor<P, R> {
    name: String,
    queue: VecDeque<Rc<Cell<Job<P, R>>>>,
}

trait JobProcessor {
    type Payload;
    type Response;
}

impl<P, R> JobProcessor for Processor<P, R> {
    type Payload = P;
    type Response = R;
}

#[derive(Default)]
struct Queue {
    processors: HashMap<String, Rc<Cell<JobProcessor<?, ?>>>>,
}

0 个答案:

没有答案