Enum.reduce / 2不输出IO

时间:2015-08-05 15:33:42

标签: elixir

我正在使用Enum.reduce,并尝试在reduce中添加一些调试输出,但它似乎不会在Enum.reduce/2中输出它。在Enum.reduce/3中按预期工作。

nodes = [%{"value" => "x"}]

Enum.each(nodes, fn (node) ->
  IO.puts "Each"
  IO.inspect node["value"]
end)

Enum.reduce(nodes, fn (node, acc) ->
  IO.puts "Reduce"
  IO.inspect node["value"]

  [node["value"], acc]
end)

Enum.reduce(nodes, [], fn (node, acc) ->
  IO.puts "Pre-accumulator"
  IO.inspect node["value"]

  [node["value"], acc]
end)

当我运行它时,我得到以下内容:

Each
"x"
Pre-accumulator
"x"

1 个答案:

答案 0 :(得分:5)

Enum.reduce/2使用枚举的第一个值作为初始累加器。如果可枚举只有一个元素(比如你正在使用的nodes),那么传递给reduce/2的函数永远不会执行,因为第一个值是累加器,并且没有其他值留下来减少。

诚然,Enum.reduce/2

的文档中没有说明这一点

http://elixir-lang.org/docs/stable/elixir/Enum.html#reduce/2

然后再次,使用第一个值作为初始累加器,同时减少它不会有意义,因为它将被"使用"两次。