Dialyzer Ошибки при вызове отсутствующей или не экспортированной функции gen_server: call / 4 - PullRequest
0 голосов
/ 29 июня 2018
stop_link(UserDefined) ->
  gen_server:call({local, UserDefined}, terminate, [], []),
  ok

Я использую диализатор для исправления предупреждения в коде erlang, я столкнулся с этой ошибкой, которая читает отсутствующую или не экспортированную функцию gen_server:call/4.

Я не могу понять, что не так с этой банкой, кто-нибудь, пожалуйста, подскажите мне, в чем ошибка Я только начал с Эрланга. Я был бы очень признателен, если бы вы могли объяснить это кратко .

1 Ответ

0 голосов
/ 29 июня 2018

Есть много вещей не так с этим кодом. Здесь идет ...

Причина, по которой вызывается функция start_link, заключается в том, что она запускает процесс и связывает с ним . Ваша stop функция должна быть вызвана stop.

Документация для gen_server:call/2,3 показывает две проблемы с этим кодом:

  1. Вам не нужна форма {local, Name} с gen_server:call. Это нужно только при вызове gen_server:start_link (и только тогда, когда вы хотите зарегистрированное имя для вашего процесса). Для вызова локальных имен просто используйте Name. Или идентификатор процесса.
  2. Не существует варианта функции с арностью 4 (т.е. 4 параметра). 3-арный вариант занимает тайм-аут. Возможно, вам нужен 2-арный.

Я подозреваю , что вы пытаетесь указать произвольную функцию в gen_server:call (т.е. вы хотите вызвать функцию terminate). Это не так.

gen_server:call(NameOrPid, Request) приводит к вызову handle_call(Request, From, State). См. документацию .

В этой функции вы можете сопоставить запрос и сделать соответствующую вещь. Примерно так:

handle_call(frob, _From, State) ->
    % do whatever 'frob' means.
    {reply, ok, NewState};

(что ; может быть ., в зависимости от того, является ли это последнее предложение handle_call).

Если вы действительно хотите, чтобы сервер остановился, вам нужно просто сделать следующее:

handle_call(terminate, _From, State) ->
    {stop, meh, State}.

Это приведет к вызову terminate.

О, и если вы только изучаете Erlang, вы, вероятно, не хотите запускать диализатор, пока не получите немного больше опыта. Это немного ... сложно ... для непосвященных. Хотя он нашел эту ошибку, и это было здорово.

...