2017-05-06 3 views
1

Es wird gesagt, dass Funktionen sind erstklassige Bürger in Elixir/Erlang. Können Funktionen als Nachrichten übergeben werden?Können Sie eine Funktion als Nachricht in Elixir/Erlang übergeben?

Beim Erkunden der Elixir API stieß ich auf Agent#get_and_update(agent, fun, timeout \\ 5000). Ich stelle mir vor, get und Update-Vorgang ist atomar. Die einzige Möglichkeit, die ich für möglich halte, ist, wenn die fun auf dem Agentenprozess und nicht auf dem Clientprozess ausgeführt wird, der mit dem Agenten interagiert.

Wenn fun auf dem Clientprozess ausgeführt wird, werden viele Fragen zur Gewährleistung der Atomarität und des Clientprozessfehlers angezeigt.

Antwort

4

Ja, Sie können.

von der agent docs for get_and_update/3.

Die Funktion fun wird die agent gesendet, die den Funktionszustand Passieren des Agenten aufruft.

Der Agentenprozess selbst führt die Funktion aus und aktualisiert ihren Status atomar.

Unter der Haube sind Agenten nur eine spezialisierte GenServer. Also, wenn wir uns den Code für get_and_update/3 ansehen, können wir sehen, dass wir tatsächlich nur die Funktion an einen GenServer übergeben.

@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

Nie realisiert Elixir Dokumentation war so gründlich! Nächstes Mal werde ich RTFM. –

Verwandte Themen