Как иметь динамические универсальные типы или динамические черты со связанными типами? - PullRequest
1 голос
/ 27 марта 2019

Можно ли пропустить или передать какой-нибудь "любой" тип?

Я хочу иметь возможность определить одну «очередь», которую можно использовать при регистрации процессоров для разных заданий. Аналогично , как работает бычья очередь в узле.

Очередь не должна заботиться о обобщениях <P, R> на процессорах. Его единственная задача - поставить в очередь задание, получить процессор для этого задания (связанный с «именем», под которым зарегистрирован процессор) и переслать ему задание.

Тем не менее, свойство processors в структуре Queue требует, чтобы ему был передан некоторый универсальный тип. Я пытался обойти это, используя черту, но я как бы вернулся к тому, с чего начал.

Я думаю, что пытаюсь имитировать тип TypeScript any.

Я видел предложения использовать enum, который бы указывал различные типы заданий; однако это усложнит процессору создания многоразовой очереди 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<?, ?>>>>,
}
...