Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 长生不老药:如何处理;环境",;_Elixir - Fatal编程技术网

Elixir 长生不老药:如何处理;环境",;

Elixir 长生不老药:如何处理;环境",;,elixir,Elixir,我有一个相当大的函数“管道”来处理输入流。 在管道启动之前,将创建一个“环境”映射,该映射将提供额外的 有关管道中函数的信息。我现在所做的,似乎 Elixir所要求的是将环境显式地传递到每个函数中 我对需求的可读性感到有点不安,因为 管道(以及它们调用的许多函数)需要环境作为参数。 另一方面,我当然明白这可能只是“做它”的一部分 在功能上” 我的问题是:我是否遗漏了处理这个问题的一些东西,也许是一个习语, 或者我应该习惯于把“额外”的论点作为 函数式编程世界 谢谢。我建议为此使用代理。以下内容完

我有一个相当大的函数“管道”来处理输入流。 在管道启动之前,将创建一个“环境”映射,该映射将提供额外的 有关管道中函数的信息。我现在所做的,似乎 Elixir所要求的是将环境显式地传递到每个函数中

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

我的问题是:我是否遗漏了处理这个问题的一些东西,也许是一个习语, 或者我应该习惯于把“额外”的论点作为 函数式编程世界


谢谢。

我建议为此使用代理。以下内容完全是虚构的,但向您展示了不同的操作,并且与您可能希望的方法类似:

def过程(数据)do
{:好的,agent}=agent.start_链接(fn->%{data:data,count:0}end)
过程(数据、代理)
结束
当pid(代理)和bar>0 do时,def处理(代理)
转换=使用(数据)进行填充
获取和更新(代理,fn%{count:count}=state->
更新=%{state |:data=>transformed,:count=>count+1}
{更新,更新}
结束
过程(代理)
结束
def进程(代理)何时为_pid(代理)且bar==0 do
cast(代理,fn%{count:count}=state->
%{state |:count=>count+1}
结束
过程(代理)
结束
def进程(代理)何时执行
get(代理,fn state->state.data end)
结束

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

是的,谢谢。这似乎是正确的,而且非常自然。这与传递地图本身有什么不同?我更新了我的示例,因为我忘了删除传递原始数据。一般的想法是代理的或临时状态,例如在某些复杂的处理过程中可能出现的状态。您可以显式地传递所有该状态,也可以使用代理来管理它。基本上,您可以实现相同的目标,这在很大程度上取决于您将选择的路径的上下文。可能并非所有处理阶段都需要当前状态,并且不希望传递未使用的内容。此解决方案只是显式传递状态的替代方案。我不认为使用进程来避免传递参数是正确的做法。当您需要容错和/或可伸缩性时,应该使用进程。诚然,最初的问题有些模糊,但我看不到我这里没有提到这些概念。使用进程实际上可能会带来额外的问题,例如性能下降(由于来回传递消息)和更复杂的日志(因为错误现在可能发生在两个不同的进程中)。因此,虽然进程确实有用,但我不会说它们是通过各种函数传递状态的解决方案。