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 回答
2

在此页面上,请特别参阅第 8.3 节及以下部分。具体来说:

函数声明还支持保护和多个子句。如果一个函数有多个子句,Elixir 将尝试每个子句,直到找到一个匹配的子句。这是一个检查给定数字是否为零的函数的实现:

defmodule Math do
  def zero?(0) do
    true
  end

  def zero?(x) when is_number(x) do
    false
  end
end

Math.zero?(0)  #=> true
Math.zero?(1)  #=> false

Math.zero?([1,2,3])
#=> ** (FunctionClauseError)

clauses在单个模块中具有多个重载的相同函数名称(尽管在文档中调用了该概念)。

于 2014-05-12T17:05:27.850 回答