Я использую CAF, чтобы смоделировать проблему для своей последней годовой диссертации, и я столкнулся со сценарием, который, я считаю, не документирован. В примере curl/curl_fuse.cpp
Государственный curl_worker
Актер определяется и создается следующим образом:
behavior curl_worker(stateful_actor<curl_state>* self, const actor& parent) {
return {
...
};
}
...
behavior curl_master(stateful_actor<master_state>* self) {
self->spawn<detached+linked>(curl_worker, self));
}
Я признаю, что цель этого подхода состоит в том, чтобы изолировать состояние субъектов и предотвратить циклические ссылки, но возможно ли построить начальный curl_state
и передать его актеру во время спавна?
Я знаю, что это может быть сделано с актерами на основе класса, однако я хотел бы избежать тех из-за вышеупомянутой ссылочной проблемы.
Да, вы можете передавать произвольные аргументы spawn
для инициализации вашего актера, как в этом примере:
struct my_state {
int value;
};
behavior my_actor(stateful_actor<my_state>* self, my_state ms) {
self->state = std::move(ms);
// ...
}
void caf_main(actor_system& sys) {
auto hdl = sys.spawn(my_actor, my_state{42});
// ...
}
Тем не менее, пример CURL хранит self
указатель в состоянии. Это сложно, потому что в этом случае вы не можете инициализировать состояние до появления актера. Лучшее, что вы можете сделать, это установить указатель вне конструктора.
Имейте в виду, что вам нужно предоставить конструктор по умолчанию для состояния независимо, потому что CAF создает состояние до входящий my_actor
, Конечно, вы можете переопределить его немедленно, но CAF все еще должен изначально создать состояние.
Других решений пока нет …