我有一个相当大的“管道”功能处理输入流。 在管道启动之前,会创建一个“环境”映射,以提供额外的映射 管道中功能的信息。我现在正在做什么,似乎 Elixir要求的是明确地将环境传递给每个函数。
我对于每个功能的要求的可读性有点不安 管道(以及它们调用的许多函数)需要将环境作为参数。 另一方面,我当然明白,这可能只是“做到这一点”的一部分 功能”。
我的问题是:我错过了处理这个问题的东西,也许是一个成语, 或者我应该习惯于传递看起来像“额外”参数的一部分 函数式编程世界?
感谢。
答案 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,并根据需要获取/更新代理的状态。