请考虑以下代码段:
def capture
Functor.function(fn(value) -> ??? end)
???
end
以可能是fn(value)
方法的返回方式捕获lambda capture
的第一个参数的首选方法是什么?
答案 0 :(得分:4)
这里你需要某种形式的可变状态。最简单的方法是使用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()
输出:
:hey
有些注意事项:
如果永远不会调用fn,您将获得代理的初始值(上面代码中的nil
)。
如果多次调用fn,您将获得最后一次调用的值。通过一些修改,您甚至可以捕获所有值,如果这是你想要的。
编辑:既然你提到你只是用它进行测试,那么还有另一种更简洁的方法。从fn向您自己发送消息并使用assert_receive
:
test "the truth" do
pid = self()
Functor.function(&send(pid, &1))
assert_receive :hey
end