EDIT:Как вы можете параметризовать модуль gen_server?
Я не хочу использовать параметры в качестве общего назначения для создания программ Erlang - я все еще изучаю традиционные принципы проектирования. Я также не хочу подражать ООП. Мое единственное дело здесь - сделать мои вызовы gen_server согласованными между экземплярами сервера. Это больше похоже на исправление сломанной абстракции для меня. Я могу представить мир, в котором язык или OTP сделали его удобным для использования api любого gen_server экземпляра, и это мир, в котором я хочу жить.
Спасибо Zed за то, что я показал, что моя основная цель возможна.
Может ли кто-нибудь выяснить способ использования параметризованных модулей в gen_servers? В следующем примере предположим, что test_child является gen_server с одним параметром. Когда я пытаюсь запустить его, все это я получаю:
42> {test_child, "hello"}:start_link().
** exception exit: undef
in function test_child:init/1
called as test_child:init([])
in call from gen_server:init_it/6
in call from proc_lib:init_p_do_apply/3
В конечном счете, я пытаюсь выяснить способ использовать несколько именованных экземпляров gen_server. Насколько я могу судить, как только вы начнете это делать, вы больше не сможете использовать свой симпатичный API и бросать сообщения в своих экземплярах с помощью gen_server: call и gen_server: cast. Если бы я мог указать экземплярам свои имена, эту проблему можно было бы смягчить.
Вы хотите, чтобы несколько gen_servers использовали один и тот же модуль обратного вызова, каждый с другим именем? Или несколько gen_servers с тем же именем? – Jacob
Несколько генераторов gen_servers, использующих один и тот же модуль обратного вызова. Вы можете передать start_link имя для регистрации разных «экземпляров» с помощью. Когда у вас есть один экземпляр, кажется, что это типично, чтобы дать ему то же имя, что и модуль, а затем ваш открытый API работает так: some_module: some_function(). ... но это похоже только удобство. Если вы зарегистрируете gen_server с другим именем, он больше не работает. Я хотел бы получить что-то вроде: 1> Mod: some_function(). 2> Mod1: some_function(). ... где каждая переменная относится к разным экземплярам модуля gen_server – mwt
Или, в качестве альтернативы, я хотел бы знать, почему я не должен заботиться об этом. Каждое вступление gen_server, которое я видел, устанавливает API, а не просто использует вызовы/вызовы gen_server.Будучи новым для Erlang, я ожидал, что вы сможете легко клонировать многие процессы, и я удивлен, что функция API ломается, как только вы переименуете gen_servers. – mwt