Можно ли пропустить или передать какой-нибудь "любой" тип?
Я хочу иметь возможность определить одну «очередь», которую можно использовать при регистрации процессоров для разных заданий. Аналогично , как работает бычья очередь в узле.
Очередь не должна заботиться о обобщениях <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<?, ?>>>>,
}