有什么方法可以定义具有不同数量的重载函数,例如在 C# 中我可以这样做:
foo(bar)
或者
foo(bar, baz)
在 Elixir 中,这样做的唯一方法是将它们放在单独的模块中,这很快就会变得混乱。有什么办法吗?
编辑:我做了一个错误的假设。我看到的重载函数的例子碰巧有相同的数量,所以我(错误地)假设这是一个要求。函数由它们的名称和数量唯一标识,因此您实际上可以重载具有不同数量的函数。
有什么方法可以定义具有不同数量的重载函数,例如在 C# 中我可以这样做:
foo(bar)
或者
foo(bar, baz)
在 Elixir 中,这样做的唯一方法是将它们放在单独的模块中,这很快就会变得混乱。有什么办法吗?
编辑:我做了一个错误的假设。我看到的重载函数的例子碰巧有相同的数量,所以我(错误地)假设这是一个要求。函数由它们的名称和数量唯一标识,因此您实际上可以重载具有不同数量的函数。
在 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
在此页面上,请特别参阅第 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
在单个模块中具有多个重载的相同函数名称(尽管在文档中调用了该概念)。