2014-02-27 12 views
4

我很難理解默認參數如何與命名函數中的多個子句進行交互。歸結起來,爲什麼下面的代碼段工作?Elixir使用多個子句的命名函數的默認參數

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

回答

10

實際上,def sum([], total \\ 0), do: total將定義一個看起來像def sum(list), do: sum(list, 0)的函數子句。所以我絕對可以看到你的困惑。我保證我們會在未來的版本中發佈此類情況的警告。謝謝!

+0

這個答案來瘋狂快:)謝謝! –