Реализация gen_event, содержащаяся в OTP, не предоставляет средства для добавления состояния.Вы можете расширить реализацию для достижения этой цели и использовать свою реализацию вместо gen_event.Однако я бы посоветовал против этого.
Тип состояния, которое вы хотите добавить в менеджер событий, действительно принадлежит обработчику событий по нескольким причинам:
Возможно, вы захотитеиспользовать разные уровни в разных обработчиках, например, показывать только ошибки на консоли, но записывать все на диск.
Если уровень события будет изменен в обработчиках событий менеджера в зависимости от получения всехнефильтрованные события могут перестать функционировать (события имеют больше применений, чем просто логирование).Это может привести к трудностям при отладке.
Если вам нужен менеджер событий для нескольких обработчиков, которые все получают только отфильтрованные события, вы легко можете добиться этого, имея два менеджера: один для нефильтрованных сообщенийи один, например, для сообщений, отфильтрованных по уровню.Затем установите обработчик на неотфильтрованный, отфильтруйте его по уровню (легко) и передайте отфильтрованные события другому менеджеру.Все обработчики, которые хотят получать только отфильтрованные сообщения, могут быть зарегистрированы во втором менеджере.
Обработчики могут иметь свое собственное состояние, которое передается при каждом обратном вызове, например:
Module:handle_event(Event, State) -> Result
Фильтрация может выглядеть следующим образом (при условии, например, {level N, Content}
события):
handle_event({level, Lvl, Content}, State#state{max_level=Max}) when Lvl >= Max ->
gen_event:notify(filtered_man, Content);
Состояние может быть изменено либо специальными событиями, gen_event:call\3,4
(предпочтительно) или сообщениями, обработанными handle_info.
Подробнее см. Поведение Gen_Event и gen_event (3)