新手对Erlang dict的问题

时间:2010-09-16 02:08:57

标签: erlang

我正在阅读Joe Armstrong(Pragmatic Bookshelf)的编程Erlang 。在第16章的name_server.erl源代码中,Where的 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}.

1 个答案:

答案 0 :(得分:4)

这是两个文件示例的一部分。另一个文件(书中紧接着它)是server.erl。它包含一个loop函数,用于调用handle中的name_server.erl函数(或传递给它的任何模块):

该行是:

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

其中Mod是先前传递给start的模块。并且State在start函数中被初始化为Mod:init()

因此State初始化为name_server:init(),您的文件中会返回dict:new()。但是,由于loop被称为递归State,因此会使用State1的下一个值。

因此,当调用handle时,Dict会设置为State的当前值。