当前位置:  开发笔记 > 前端 > 正文

Stream.into + Stream.run与Enum.into完全相同?

如何解决《Stream.into+Stream.run与Enum.into完全相同?》经验,为你挑选了1个好方法。

Elixir允许您使用Streams而不是Enums来阻止集合的中间副本.但是当你迈出最后一步时,它会不会重要?

即使你得到最小的细节也不是这个

Stream.concat(header, rows)
|> CSV.encode
|> Stream.into(output)
|> Stream.run

这个一样吗?

Stream.concat(header, rows)
|> CSV.encode
|> Enum.into(output)

如果是这样,为什么甚至提倡Stream.into + Stream.run配对而不仅仅是说Enum.into? http://elixir-lang.org/docs/v1.0/elixir/Stream.html#into/3

也许这很简单,因为它更具可读性和可发现性.



1> Patrick Osci..:

你的两个例子并没有真正做同样的事情.第一个只运行流管道,而第二个也会给你一个返回值.由于您没有使用结果,Stream.run在这种情况下就好了.

通常,如果您对流的结果感兴趣,则可以始终使用Enum管道最后一步中的对应项.Stream.run不会返回结果,而是适用于管道,然后返回:ok.如果您对副作用而不是实际返回值感兴趣,这将非常有用.

我想我们之所以有Stream.into这样的原因,它可能实际上并不是管道中的最后一步.这是一个人为的例子:

output = IO.stream(:stdio, :line)

Stream.iterate(0, &(&1 + 1))
|> Stream.chunk(2, 1)
|> Stream.into(output, &"BEFORE: #{inspect &1}\n")
|> Stream.map(fn [x, y] -> x * y end)
|> Stream.into(output, &"AFTER: #{inspect &1}\n")
|> Stream.take(3)
|> Stream.run

哪个会输出

BEFORE: [0, 1]
AFTER: 0
BEFORE: [1, 2]
AFTER: 2
BEFORE: [2, 3]
AFTER: 6

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有