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

dim*_*roc 3 elixir

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

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

Stream.concat(header, rows)
|> CSV.encode
|> Stream.into(output)
|> Stream.run
Run Code Online (Sandbox Code Playgroud)

这个一样吗?

Stream.concat(header, rows)
|> CSV.encode
|> Enum.into(output)
Run Code Online (Sandbox Code Playgroud)

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

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

Pat*_*ity 7

你的两个例子并没有真正做同样的事情.第一个只运行流管道,而第二个也会给你一个返回值.由于您没有使用结果,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
Run Code Online (Sandbox Code Playgroud)

哪个会输出

BEFORE: [0, 1]
AFTER: 0
BEFORE: [1, 2]
AFTER: 2
BEFORE: [2, 3]
AFTER: 6
Run Code Online (Sandbox Code Playgroud)