Sie brauchen hier eine Form von veränderbaren Zustand. Der einfachste Weg ist die Verwendung Agent
:
defmodule Functor do
def function(f) do
f.(:hey)
end
def capture do
{:ok, agent} = Agent.start_link(fn -> nil end)
Functor.function(fn(value) ->
Agent.update(agent, fn _ -> value end)
end)
Agent.get(agent, &(&1))
end
end
IO.inspect Functor.capture()
Ausgang:
:hey
Einige Dinge zu beachten:
Wenn die fn nie genannt wird, werden Sie den Anfangswert des Agenten erhalten (nil
im obigen Code).
Wenn das Fn mehr als einmal aufgerufen wird, erhalten Sie den Wert des letzten Anrufs. Mit ein wenig Modifikation können Sie sogar alle Werte erfassen, wenn Sie das wollen.
Edit: Da Sie nur das für die Prüfung verwendet ist erwähnt, gibt es eine andere ist, viel prägnante Weise. Senden Sie eine Nachricht an sich selbst von der FN und bestätigen Sie mit assert_receive
:
test "the truth" do
pid = self()
Functor.function(&send(pid, &1))
assert_receive :hey
end
Nicht sicher, dass ich die Frage verstehe. Sie möchten "Wert" von "Capture" zurückgeben? Was, wenn dieses Fn nicht einmal aufgerufen wird? und was, wenn dieses Fn mehr als einmal aufgerufen wird? – Dogbert
@Dogbert Versucht, zu den von Ihnen angesprochenen Problemen zu klären, danke für die Rückmeldung! Liebte deinen Nick;) – Kalecser