В примере, который вы опубликовали, оба определения функции имеют одинаковое количество аргументов: 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)
e.g.
iex(1)> Lol.mutant(2)
4
iex(2)> Lol.mutant(2,3)
6
iex(3)> Lol.mutant(2,3,4)
22
Он работает немного похоже на (лямбда-аргумент ...) в схеме - представьте, что мутант принимает все свои аргументы в виде списка и сопоставляет его. Но на этот раз elixir рассматривает mutant как 3 функции, mutant/1, mutant/2 и mutant/3, и будет ссылаться на них как такой.
Итак, чтобы ответить на ваш вопрос: это не перегруженные функции, а скорее разбросанные/фрагментированные определения. Вы видите похожие в функциональных языках, таких как miranda, haskell или sml.
person
dercz
schedule
12.07.2016
when
Guard. Это одна и та же функция, просто она имеет несколько реализаций. - person deceze♦   schedule 12.07.2016