在 Elixir/Erlang 中可以将函数作为消息传递吗?

Abh*_*k S 1 elixir

据说函数是 Elixir/Erlang 中的一等公民。函数可以作为消息传递吗?

在探索 Elixir API 时,我遇到了Agent#get_and_update(agent, fun, timeout \\ 5000). 我想获取和更新操作是原子的。我认为这是可能的唯一方法是fun在代理进程而不是与代理交互的客户端进程上运行。

如果fun在客户端进程上运行,则会带来许多有关保证原子性和客户端进程失败的问题。

Jus*_*ood 5

是的你可以。

来自 的代理文档get_and_update/3

该函数fun被发送到agent调用传递代理状态的函数。

代理进程本身运行该函数,以原子方式更新其状态。

在幕后,特工只是一个专门的GenServer。因此,如果我们查看 的代码get_and_update/3,我们可以看到我们实际上只是将函数传递给 aGenServer来运行。

@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
Run Code Online (Sandbox Code Playgroud)