Вопрос новичка для Erlang dict

Я читаю Programming Erlang Джо Армстронга (Pragmatic Bookshelf). В исходном коде name_server.erl в главе 16, откуда переменная Dict? Вызов dict:new() автоматически генерирует Dict? И ссылка говорит, что dict:new() создает словарь. Разве мне не нужно хранить его как переменную, например Dict = dict:new()?

-module(name_server).
-export([init/0, add/2, whereis/1, handle/2]).
-import(server1, [rpc/2]).

add(Name, Place)  ->
  rpc(name_server, {add, Name, Place}).

whereis(Name) ->
  rpc(name_server, {whereis, Name}).

init()  ->
  dict:new().

handle({add, Name, Place}, Dict)  ->
  {ok, dict:store(Name, Place, Dict)};
handle({whereis, Name}, Dict) ->
  {dict:find(Name, Dict), Dict}.

person Hongseok Yoon    schedule 16.09.2010    source источник


Ответы (1)


Это часть примера с двумя файлами. Другой файл (непосредственно перед ним в книге) — server.erl. Он содержит функцию loop, которая вызывает функцию handle в name_server.erl (или любом другом модуле, который вы ей передаете):

Строка:

{Response, State1} = Mod:handle(Request, State),

где Mod — модуль, ранее переданный start. А State инициализируется раньше как Mod:init() в функции запуска.

Итак, State инициализируется name_server:init(), который в вашем файле возвращает dict:new(). Однако, поскольку loop вызывается рекурсивно, State примет следующее значение State1.

Поэтому, когда вызывается handle, Dict устанавливается равным текущему значению State.

person Muhammad Alkarouri    schedule 16.09.2010