如何在Elixir中编写自己的流功能?
我写了一个简单的Stream.unfold功能,当我这样称呼它的正常工作:如何在Elixir中编写自己的流功能?
a = Stream.unfold({1,2,3}, &my_unfold_func) |> Stream.take(5)
不过,我似乎无法找到实现包装的一种方式,让我来直接调用我的函数,例如像这样:
a = my_unfold_wrapper() |> Stream.take(5)
我已经试过是:
def my_unfold_wrapper(), do: Stream.unfold({1,2,3}, &my_unfold_func)
当我运行这段代码,我得到的错误:
#Stream<[enum: #Function<35.27730995/2 in Stream.unfold/2>,
funs: [#Function<38.27730995/1 in Stream.take/2>]]>
[Finished in 0.7s]
这个问题似乎是该流.take()返回另一个流,我不知何故需要执行转换为一个数组。用Enum.take替换Stream.take似乎有诀窍,这就留下了我如何执行流的问题。
我想我已经破解了它,后续的代码做相当多我想要的:
Foobar.my_unfold_wrapper()
|> Stream.take(10)
|> Stream.into(File.stream!("output.txt", [:write, :utf8]))
|> Stream.run
我有这个唯一的问题是现在的输出被串接到一个庞大的线 - 这是我在一个单独的SO问题都提出了一个问题。
这是运行Stream的正确方法。如果你也想要流的值,你可以使用'Enum.to_list/1'而不是'Stream.run/1'得到一个列表。但是对于写入文件'Stream.run'是正确的选择。要流线/添加换行符到一个文件,你应该添加':line'选项。 –
如何将行选项添加到File.stream!呼叫?我试着把它写入:write等,也作为一个单独的参数,在其他选项列表之前或之后,但这些方法都不起作用。 – Andy
编译时使用|> Stream.into(File.stream!(“output.txt”,[],:line)) ,但这似乎没有任何影响。现在使用map函数在每条输出行的末尾附加一个新行。 – Andy
这看起来很好,为了调试这个我们需要更多的信息。什么是你得到的具体错误信息?你能告诉我们'my_unfold_func'的定义吗? –
运行'new'代码时的输出结果如下:#Stream , funs:[#Function ]]> [在0.7s中完成]问题似乎是Stream.take()返回另一个流,我需要执行该流以转换为数组。用Enum.take替换Stream.take似乎有诀窍,这就留下了我如何执行流的问题。另外,如何在SO注释中插入新行?即没有终止评论? – Andy
编辑您的问题以包含您在该评论中输入的错误信息。 –