我有一个功能,其内部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
的正确语法吗?为什么这个错误看起来如此随机?
答案 0 :(得分:2)
cond
返回每个正文中最后一个表达式的值。代码失败是因为您最终返回:ok
(IO.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)
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
来电