我是Erlang的新手,我想知道两个代码片段之间的区别。
spawn_link(exit(fun()-> myfun() end))
和
spawn_link(fun()->exit(myfun()) end)
我认为行为是一样的,但事实并非如此。
答案 0 :(得分:4)
spawn_link
是一个函数,调用的行为与普通函数调用类似:首先计算参数,然后使用计算的参数调用函数。
所以在第一个例子中,spawn_link
的参数是:
exit(fun()-> myfun() end)
exit
,当使用一个参数调用时,使用参数作为退出原因使当前进程退出。因此,在这种情况下,进程在有机会调用spawn_link
之前崩溃,并且永远不会生成新进程。 (当前进程的退出原因是fun
,这是非常不寻常的,但允许。fun
将不会被调用。)
在第二个例子中,spawn_link
的参数是:
fun()->exit(myfun()) end
那是fun
。在调用函数之前,不会评估其中的表达式。因此,我们将此函数传递给spawn_link
,这会生成一个运行此函数的新进程。新生成的流程将调用myfun
,然后以myfun
的返回值作为退出原因退出。