elixir - Stream.into + Stream.run 与 Enum.into 相同吗?

标签 elixir

Elixir 允许您使用 Stream 而不是 Enum 来防止集合的中间副本。但当你走到最后一步时,这还有关系吗?

即使你了解最小的细节也不是这样

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

和这个一样吗?

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

如果是这样,为什么会 the Stream.into/3 docs提倡将 Stream.into + Stream.run 配对,而不仅仅是说 Enum.into

也许这很简单,只是更具可读性和可发现性。

最佳答案

你的两个例子并没有真正做同样的事情。第一个仅运行流管道,而第二个也会为您提供返回值。由于您没有使用结果,因此在这种情况下 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

关于elixir - Stream.into + Stream.run 与 Enum.into 相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34625236/

相关文章:

testing - 在 Controller 测试中使用响应数据

elixir - 小写电子邮件地址并在保存前创建 MD5 和

erlang - 在 Erlang/Elixir 中获取消息队列的总大小

testing - doctest Phoenix 语境

elixir - Ecto "left IN right"使用片段查询

erlang - 原子数限制

elixir - Elixir 映射中相同值键名称的模式匹配快捷方式

elixir - 有没有相当于 Rails Console 的 Phoenix

postgresql - "Could not lookup Ecto repo"测试期间错误

elixir - 如何验证嵌套映射中的必需