我有这些代码
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错误,我需要导出播放功能,我只是拒绝
码
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
.