2017-05-06 72 views
1

據說功能是Elixir/Erlang的頭等公民。函數可以作爲消息傳遞嗎?你可以在Elixir/Erlang中傳遞一個函數嗎?

在探索Elixir API時,我碰到了Agent#get_and_update(agent, fun, timeout \\ 5000)。我想象得到和更新操作是原子的。我認爲這是可能的唯一方法是如果fun在代理進程上運行,而不是與代理進行交互的客戶端進程。

如果fun在客戶端進程上運行,它會引發很多關於保證原子性和客戶端進程失敗的問題。

回答

4

是的,你可以。

來自agent docs for get_and_update/3

函數fun被髮送到agent,該函數調用傳遞代理狀態的函數。

代理進程本身運行該函數,以原子方式更新其狀態。

在引擎蓋下,代理商只是一個專門的GenServer。所以如果我們看看get_and_update/3的代碼,我們可以看到我們實際上只是將該函數傳遞給GenServer來運行。

@spec get_and_update(agent, (state -> {a, state}), timeout) :: a when a: var 
def get_and_update(agent, fun, timeout \\ 5000) when is_function(fun, 1) do 
    GenServer.call(agent, {:get_and_update, fun}, timeout) 
end 
+1

從來沒有意識到Elixir文檔是如此的透徹!下次我會RTFM。 –

相關問題