代码之家  ›  专栏  ›  技术社区  ›  kyle

如何为Rust中的struct属性省略或使用任何泛型类型?

  •  0
  • kyle  · 技术社区  · 7 年前

    可以省略或传递一些“any”类型吗?

    我想能够定义一个单独的“队列”,它可以通过为不同的作业注册处理器来使用。类似 how bull queue 在节点工程中。

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

    processors 上的属性 Queue 结构需要一些泛型类型才能传递给它。我试着用一种特质来回避这个问题,但我有点回到了我开始的地方。

    我想我是在模仿打字稿 any 键入。

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

    如果我要这样做,而不是让用户只注册不同的处理器,他们将不得不注册它们以及修改新作业类型的枚举。另外,由于作业是基于关联的处理器进行匹配的,因此模式匹配没有好处。

    我要找的似乎就是戴恩的特质。但是,我不明白当特征有关联类型时它是如何工作的。

    #[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 回复  |  直到 7 年前