2017-05-06 69 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。 –

相关问题