EDYTOWANIE:Jak sparametryzować moduł gen_server?
Nie zamierzam używać parametrów jako ogólnego celu budowania programów Erlang - wciąż uczę się tradycyjnych zasad projektowania. Nie zamierzam też naśladować OOP. Moim jedynym celem jest uczynienie moich połączeń gen_server spójnymi między instancjami serwera. Wydaje mi się, że przypomina to łamanie abstrakcji. Mogę sobie wyobrazić świat, w którym język lub OTP ułatwiał korzystanie z api dowolnego serwera instancji gen_server i jest to świat, w którym chcę żyć.
Dziękuję Zedowi za wykazanie, że mój główny cel jest możliwy.
Czy każdy może znaleźć sposób na sparametryzowanie modułów na serwerach gen_servers? W poniższym przykładzie załóżmy, że test_child jest serwerem gen_ z jednym parametrem. Gdy próbuję go uruchomić, wszystko pojawia się:
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
Ostatecznie Próbuję wymyślić sposób korzystania z wielu nazwanych wystąpień gen_server. O ile mogę powiedzieć, jak tylko zaczniesz to robić, nie możesz już używać swojego pięknego interfejsu API i musisz wysyłać wiadomości do swoich instancji za pomocą komendy gen_server: call i gen_server: cast. Gdybym mógł podać instancji ich imiona, ten problem mógłby zostać złagodzony.
Chcesz wielu serwerów nazw używając tego samego modułu wywołania zwrotnego, z których każda ma inną nazwę? Lub wiele serwerów nazw o tej samej nazwie? – Jacob
Wiele serwerów gen_ przy użyciu tego samego modułu oddzwaniania. Możesz przekazać start_link nazwę, aby zarejestrować różne "instancje" za pomocą. Kiedy masz jedną instancję, wydaje się, że typowe jest nadanie jej tej samej nazwy co moduł, a twój publiczny interfejs API działa tak: some_module: some_function(). ... ale to wydaje się być tylko wygodą. Jeśli zarejestrujesz gen_server pod inną nazwą, to już nie działa. Chciałbym skończyć z czymś takim jak: 1> Mod: some_function(). 2> Mod1: some_function(). ... gdzie każda zmienna odnosi się do różnych wystąpień modułu gen_server – mwt
Lub, alternatywnie, chciałbym wiedzieć, dlaczego nie powinienem się tym przejmować. Każde intro gen_server, które widziałem, tworzy interfejs API, a nie tylko używa rzutów/wywołań serwera gen_server.Będąc nowicjuszem w firmie Erlang, spodziewałem się, że będę mógł łatwo klonować wiele procesów i jestem zaskoczony, że funkcja API zrywa się z chwilą zmiany nazwy serwerów gen_servers. – mwt