基本Erlang问题

基本Erlang问题,erlang,Erlang,我一直在学习Erlang,遇到了Joe Armstrong编写的一些代码: start() -> F = fun interact/2, spawn(fun() -> start(F, 0) end). interact(Browser, State) -> receive {browser, Browser, Str} -> Str1 = lists:reverse(Str), B

我一直在学习Erlang,遇到了Joe Armstrong编写的一些代码:

start() ->
    F = fun interact/2,
    spawn(fun() -> start(F, 0) end).

interact(Browser, State) ->
    receive
        {browser, Browser, Str} ->
            Str1 = lists:reverse(Str),
            Browser ! {send, "out ! " ++ Str1},
            interact(Browser, State);
    after 100 ->
        Browser ! {send, "clock ! tick " ++ integer_to_list(State)},
        interact(Browser, State+1)
end.
这是一篇关于将WebSocket与Erlang结合使用的博客文章:


有人能给我解释一下为什么在start函数中,当start是一个接受零参数的函数时,他会生成匿名函数start(F,0)。在Erlang中,函数是通过它们的名称和它们的算术(参数的数量)来识别的。可以有多个同名函数,只要它们都有不同数量的参数。上面发布的两个功能是
start/0
interact/2
<代码>开始/0不调用自身;相反,它会调用
start/2
,如果您进一步查看链接到的页面,就会找到
start/2
的定义


以这种方式使用
spawn
的目的是在后台启动服务器进程,并将控制权返回给调用者。要使用这段代码,我想您应该启动Erlang解释器,加载脚本,然后调用
start/0
函数。然后,此方法将在后台启动一个进程并返回,以便您可以继续在Erlang解释器中键入内容。

在这篇博文(清单)的下面,您可以看到另一个函数(start/2)包含两个参数:

start(F, State0) ->
{ok, Listen} = gen_tcp:listen(1234, [{packet,0},
                                  {reuseaddr,true},
                                  {active, true}]),
par_connect(Listen, F, State0).

您引用的代码示例只是为了简单起见省略了此函数的一个摘录。

以这种方式产生
乐趣的原因是为了避免导出仅用于内部使用的函数。一个问题是,所有导出的函数都可供所有用户使用,即使它们仅用于内部使用。这方面的一个例子是
gen_server
的回调模块,它通常包含客户端的导出API和gen_server行为的回调函数。回调函数仅可由
gen_服务器
行为调用,其他人不可调用,但它们在导出列表中可见,在任何情况下都不会被阻止

生成
fun
会减少导出的内部函数的数量