在您发布的示例中,函数的两个定义具有相同数量的参数:2,这个“何时”事物是一个守卫,但您也可以有许多参数的定义。首先,守卫——它们被用来表达不能被写成仅仅匹配的东西,比如下面的第二行:
def fac(0), do: 1
def fac(n), when n<0 do: "no factorial for negative numbers!"
def fac(n), do: n*fac(n-1)
- 因为不可能仅通过相等/匹配来表示负数。
顺便说一句,这个fac是一个单一的定义,只有三种情况。请注意在参数位置使用常量“0”的酷炫 :) 您可以认为这是更好的编写方式:
def fac(n) do
if n==0, do: 1, else: if n<0, do: "no factorial!", else: n*fac(n-1)
end
或开关盒(甚至看起来非常接近上述):
def fa(n) do
case n do
0 -> 1
n when n>0 -> n*fa(n-1)
_ -> "no no no"
end
end
只有“看起来更花哨”。实际上,事实证明某些定义(例如解析器、小型解释器)在前者中看起来比后一种风格好得多。Nb 守卫表达式非常有限(我认为您不能在守卫中使用自己的函数)。
现在是真实的,不同数量的参数 - 看看这个!
def mutant(a), do: a*a
def mutant(a,b), do: a*b
def mutant(a,b,c), do: mutant(a,b)+mutant(c)
例如
iex(1)> Lol.mutant(2)
4
iex(2)> Lol.mutant(2,3)
6
iex(3)> Lol.mutant(2,3,4)
22
它的工作原理有点类似于方案中的 (lambda arg ...) —— 将突变体视为将其所有参数作为一个列表并对其进行匹配。但这一次,elixir 将mutant 视为3 个函数,mutant/1、mutant/2和mutant/3并会这样称呼它们。
所以,回答你的问题:这些不像重载函数,而是分散/碎片化的定义。您会在 miranda、haskell 或 sml 等函数式语言中看到类似的语言。