添加puts函数时,cond失败

时间:2017-06-08 21:10:17

标签: elixir

我有一个功能,其内部Enum.reduce尝试更新地图。现在我不确定你能做到这一点但是当行IO.puts("TEST")打开时,代码在打印TEST后的下一次迭代中失败。如果删除该行,则代码可以正常工作。

   def to_table({team, matches}, table) do
    Enum.reduce matches, table, fn({vteam, result}, table) ->
      %{f: lo, a: vi} = result
      cond do
        lo == vi ->
          put_in(table, [team], table[team] + 1)
          put_in(table, [vteam], table[vteam] + 1)
          IO.puts("TEST")
        lo > vi ->
          put_in(table, [team], table[team] + 3)
        lo < vi ->
          put_in(table, [vteam], table[vteam] + 3)
      end
    end
  end

这是cond的正确语法吗?为什么这个错误看起来如此随机?

3 个答案:

答案 0 :(得分:2)

cond返回每个正文中最后一个表达式的值。代码失败是因为您最终返回:okIO.puts的返回值而不是表格);您需要从第一个子句(table)返回更新的lo == vi

cond do
  lo == vi ->
    table = put_in(table, [team], table[team] + 1)
    table = put_in(table, [vteam], table[vteam] + 1)
    IO.puts("TEST")
    table
  lo > vi ->
    put_in(table, [team], table[team] + 3)
  lo < vi ->
    put_in(table, [vteam], table[vteam] + 3)
end

答案 1 :(得分:1)

来自documentation

  

reduce(enumerable,acc,fun)

     

为枚举中的每个元素调用fun,传递该元素并将累加器作为参数传递。 fun的返回值存储在acc

您的cond个分支之一不会返回累加器的新值。 (IO.puts

的那个

答案 2 :(得分:1)

这是因为您传递给Enum.reduce/3的匿名函数必须在结尾处返回

当您执行IO.puts("TEST")时,它会返回:ok,因此下一次迭代table将被限制为:ok而不是map,它将失败,因为put_in/3需要地图。

尝试将IO.puts/1移到put_in/3来电

之上