如何在 Elixir 中定义具有多个子句和可选参数的函数

msz*_*rlo 1 elixir

我试图了解如何正确定义具有多个子句和可选参数的函数。当我写作时

  def sum([], total \\ 0), do: total
  def sum([h|t], total), do: h + sum(t, total)
Run Code Online (Sandbox Code Playgroud)

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

我收到警告:

warning: def sum/2 has multiple clauses and also declares default values. 
In such cases, the default values should be defined in a header. Instead of:

    def foo(:first_clause, b \\ :default) do ... end
    def foo(:second_clause, b) do ... end

one should write:

    def foo(a, b \\ :default)
    def foo(:first_clause, b) do ... end
    def foo(:second_clause, b) do ... end
Run Code Online (Sandbox Code Playgroud)

我觉得 的定义sum遵循了这个建议。

谁能解释为什么会发生这种情况以及定义的正确方法是什么sum和消除警告的正确方法是什么。

我的 Elixir 版本是 1.12.2。

提前致谢

Ale*_*kin 7

声明不带头子句do声明一个不带默认块的

\n
def sum(list, total \\\\ 0) # \xe2\x87\x90 THIS\n\ndef sum([], total), do: total\ndef sum([h | t], total), do: h + sum(t, total)\n
Run Code Online (Sandbox Code Playgroud)\n

  • 仅供参考,这里是[默认参数的文档](https://hexdocs.pm/elixir/Kernel.html#def/2-default-arguments),它记录了此用例。 (2认同)