我正在阅读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}.
答案 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
的当前值。