2016-12-05 47 views
3

在靈藥中,我們有spawn/1產生一個沒有任何參數的匿名函數和spawn/3產生一個具有參數的完全限定的函數。但是,我如何產生一個需要參數的匿名函數呢?如何用參數產生一個匿名函數?

示例:我想運行接收消息的匿名函數,直到滿足特定條件。參數是函數本身能夠執行遞歸步驟。

loop = fn f -> 
    receive do 
    {:end, pid} -> send(pid, "exiting") 
    {_, pid} -> 
     send(pid, "unrecognized message, keep waiting...") 
     f.(f) 
    end 
end 

child = spawn() # How do I spawn it passing itself as an argument? 
+1

爲什麼不'重生(FN - >循環。 (循環)結束)'?這似乎在這裏工作得很好。 – Dogbert

+0

沒想到,這絕對是一個解決方案。回答這個問題,如果這是最直接的方式,我會接受它。謝謝。 – lufte

回答

5

您可以創建一個新的匿名函數來處理,以loop第一個呼叫,並讓loop處理其餘部分:

spawn(fn -> loop.(loop) end) 
iex(1)> loop = fn f -> 
...(1)> receive do 
...(1)>  {:end, pid} -> send(pid, "exiting") 
...(1)>  {_, pid} -> 
...(1)>  send(pid, "unrecognized message, keep waiting...") 
...(1)>  f.(f) 
...(1)> end 
...(1)> end 
#Function<6.52032458/1 in :erl_eval.expr/5> 
iex(2)> pid = spawn(fn -> loop.(loop) end) 
#PID<0.90.0> 
iex(3)> send pid, {:foo, self} 
{:foo, #PID<0.80.0>} 
iex(4)> flush 
"unrecognized message, keep waiting..." 
:ok 
iex(5)> send pid, {:end, self} 
{:end, #PID<0.80.0>} 
iex(6)> flush 
"exiting" 
:ok 
iex(7)> Process.alive? pid 
false