Elixir - 从lambda捕获价值

时间:2017-04-08 16:05:27

标签: elixir

请考虑以下代码段:

def capture
    Functor.function(fn(value) -> ??? end)
    ???
end
  • 假设lambda DOES确实被调用一次

以可能是fn(value)方法的返回方式捕获lambda capture的第一个参数的首选方法是什么?

1 个答案:

答案 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