Что с этим анонимным синтаксисом функции?
Просто начинаю путешествие в Эликсир. Читая это в книге:
"Оператор and преобразует выражение, которое следует в функцию."
ОК, я думаю, что получил это...
iex(70)> f = &(&1 * &2)
#Function<12.80484245 in :erl_eval.expr/5>
iex(72)> f.(2,3)
6
ok, амперсанд является сокращением анонимной функции и аргументами. Но тогда почему этот следующий вызов не работает?!
iex(73)> &(&1 * &2).()
#Function<12.80484245 in :erl_eval.expr/5>
... и я могу продолжать делать это, казалось бы, навсегда:
iex(76)> &(&1 * &2).().().()
#Function<12.80484245 in :erl_eval.expr/5>
что здесь происходит?
Ответы
Ответ 1
Если вы завершите анонимную функцию круглыми скобками, она будет работать:
iex(1)> (&(&1 * &2)).()
** (BadArityError) &:erlang.*/2 with arity 2 called with no arguments
Ожидается ошибка, так как мы вызываем забаву 2 arity с нулевыми аргументами. Если мы передадим ему два числа, мы должны увидеть, что они умножаются вместе:
iex(2)> (&(&1 * &2)).(2,3)
6