Elixir:如何处理"环境"

时间:2014-07-31 15:35:38

标签: elixir

我有一个相当大的“管道”功能处理输入流。 在管道启动之前,会创建一个“环境”映射,以提供额外的映射 管道中功能的信息。我现在正在做什么,似乎 Elixir要求的是明确地将环境传递给每个函数。

我对于每个功能的要求的可读性有点不安 管道(以及它们调用的许多函数)需要将环境作为参数。 另一方面,我当然明白,这可能只是“做到这一点”的一部分 功能”。

我的问题是:我错过了处理这个问题的东西,也许是一个成语, 或者我应该习惯于传递看起来像“额外”参数的一部分 函数式编程世界?

感谢。

1 个答案:

答案 0 :(得分:4)

我建议使用代理商。以下内容完全构成,但向您展示了不同的操作,并且类似于您可能想要的方法:

def process(data) do
  {:ok, agent} = Agent.start_link(fn -> %{data: data, count: 0} end)
  process(data, agent)
end

def process(agent) when is_pid(agent) and bar > 0 do
  transformed = do_stuff_with(data)
  Agent.get_and_update(agent, fn %{count: count} = state ->
    updated = %{state | :data => transformed, :count => count + 1}
    {updated, updated}
  end
  process(agent)
end

def process(agent) when is_pid(agent) and bar == 0 do
  Agent.cast(agent, fn %{count: count} = state ->
    %{state | :count => count + 1}
  end
  process(agent)
end

def process(agent) when is_pid(agent) do
  Agent.get(agent, fn state -> state.data end)
end

不是传递状态,而是传递代理的PID,并根据需要获取/更新代理的状态。