5

我很难理解默认参数如何与命名函数中的多个子句交互。归结为,为什么以下代码段有效?

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

使用Elixir 0.12.4

4

1 回答 1

13

实际上,def sum([], total \\ 0), do: total将定义一个看起来像def sum(list), do: sum(list, 0). 所以我肯定能看出你的困惑。我保证我们会在未来的版本中针对此类情况发出警告。谢谢!

于 2014-02-27T21:56:44.827 回答