需要我导出Erlang shell中的所有函数吗?

why*_*why 3 erlang

我有这些代码

start() ->
    spawn(?MODULE, init, [self()]).

init(From) ->
    spawn(?MODULE, broadcast, []).    

broadcast() ->
    Msg = "helloworld",
    timer:sleep(10000),
    broadcast().
Run Code Online (Sandbox Code Playgroud)

当我在Erlang shell中测试这些代码时,它给我undef错误,我需要导出播放功能,我只是拒绝

Hyn*_*dil 5

spawn(?MODULE, init, [self()]).
Run Code Online (Sandbox Code Playgroud)

意味着你将产生初始调用将是?MODULE:init(self())或更准确等效的进程apply(?MODULE,init,[self()]).?MODULE是宏评估当前模块名称,但无论如何它是外部函数调用所以即使?MODULE使用该函数也必须导出.相对的

spawn(fun() -> init(self()) end).
Run Code Online (Sandbox Code Playgroud)

产生初始调用func fun() -> init(self()) end调用init/1函数的结果self().这是本地电话,意味着init/1可能无法导出.self()在新进程中执行时还有另一个问题,因此您必须编写

Self = self(), spawn(fun() -> init(Self) end).
Run Code Online (Sandbox Code Playgroud)

实现与在spawn(?MODULE, init, [self()])哪里self()被评估为参数的相同效果spawn/3.