相关疑难解决方法(0)

Elixir具有多个子句的命名函数的默认参数

我无法理解默认参数如何与命名函数中的多个子句交互.归结起来,为什么以下片段有效?

defmodule Lists do

  def sum([], total \\ 0), do: total
  def sum([h|t], total), do: h + sum(t, total)

end
Run Code Online (Sandbox Code Playgroud)

根据我的理解,编译器将其扩展为:

defmodule Lists do

  def sum([]), do: sum([], 0)
  def sum([], total), do: total
  def sum([h|t], total), do: h + sum(t, total)

end
Run Code Online (Sandbox Code Playgroud)

所以我希望发生以下情况:

iex(1)> Lists.sum [1,2,3,4]
** (FunctionClauseError) no function clause matching in Lists.sum/1
Run Code Online (Sandbox Code Playgroud)

相反,它有效:

iex(1)> Lists.sum [1,2,3,4]
10
Run Code Online (Sandbox Code Playgroud)

使用Elixir 0.12.4.

elixir default-parameters

4
推荐指数
1
解决办法
2752
查看次数

标签 统计

default-parameters ×1

elixir ×1