我无法理解默认参数如何与命名函数中的多个子句交互。归根结底,为什么下面的代码片段有效?
defmodule Lists do
def sum([], total \\ 0), do: total
def sum([h|t], total), do: h + sum(t, total)
end
根据我的理解,编译器将其扩展为:
defmodule Lists do
def sum([]), do: sum([], 0)
def sum([], total), do: total
def sum([h|t], total), do: h + sum(t, total)
end
所以我预计会发生以下情况:
iex(1)> Lists.sum [1,2,3,4]
** (FunctionClauseError) no function clause matching in Lists.sum/1
相反,它有效:
iex(1)> Lists.sum [1,2,3,4]
10
Using 长生不老药 0.12.4.