Enum.reduce/2不输出IO

roc*_*BOO 4 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)
Run Code Online (Sandbox Code Playgroud)

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

Each
"x"
Pre-accumulator
"x"
Run Code Online (Sandbox Code Playgroud)

wha*_*ide 5

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

不可否认,文档中没有说明Enum.reduce/2:

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

但是再一次,使用第一个值作为初始累加器,同时减少它就没有意义,因为它将被"使用"两次.