7

異なるアリティを持つオーバーロード関数を定義する方法はありますか?たとえば、C# では次のようにできます:

foo(bar)

また

foo(bar, baz)

Elixir では、これを行う唯一の方法は、それらを別々のモジュールに入れることです。それを回避する方法はありますか?

編集:私は間違った仮定をしていました。私が見たオーバーロードされた関数の例はたまたま同じアリティを持っていたので、(誤って) これが要件であると想定しました。関数は名前とアリティによって一意に識別されるため、実際には異なるアリティで関数をオーバーロードできます。

4

2 に答える 2

13

Erlang と Elixir では、他の多くの言語 (C# など) とは異なり、関数は名前とアリティによって一意に識別されるため、技術的foo(bar)foo(bar, baz)は完全に異なる関数です。しかし、これは単なる技術的な話です。Elixir で「オーバーロードされた」関数を作成するには、次のような の定義を作成しますsum

defmodule Math do
  def sum(list),       do: sum(list, 0)
  def sum([], acc),    do: acc
  def sum([h|t], acc), do: sum(t, acc + h)
end
于 2014-05-12T03:54:25.700 に答える