新手关于 Erlang dict 的问题

发布于 2024-09-24 00:02:19 字数 634 浏览 0 评论 0原文

我正在阅读 Joe Armstrong 的《Programming Erlang》(实用书架)。在第16章的name_server.erl源代码中,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}.

I'm reading Programming Erlang by Joe Armstrong(Pragmatic Bookshelf). In name_server.erl source code on Chapter 16, Where's Dict variable from? Calling dict:new() generates Dict automatically? And, reference says that dict:new() creates dictionary. Don't I need to store it as a variable like 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}.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

饮惑 2024-10-01 00:02:19

这是两个文件示例的一部分。另一个文件(在本书中就在它之前)是server.erl。它包含一个 loop 函数,该函数调用 name_server.erl(或您传递给它的任何模块)中的 handle 函数:

该行是

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

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

因此,State 被初始化为 name_server:init(),它在您的文件中返回 dict:new()。但是,当递归调用 loop 时,State 将采用 State1 的下一个值。

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

This is part of a two file example. The other file (immediately before it in the book) is server.erl. It contains a loop function that calls the handle function in name_server.erl (or whatever module you pass to it):

The line is:

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

where Mod is the module passed to start earlier. And State is initialised earlier as Mod:init() in the start function.

So State is initialised to name_server:init() which in your file returns dict:new(). However, as loop is called recursively State will take the next value of State1.

So when handle is called, Dict is set to the current value of State.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文