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/