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
也许这很简单,因为它更具可读性和可发现性.
你的两个例子并没有真正做同样的事情.第一个只运行流管道,而第二个也会给你一个返回值.由于您没有使用结果,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