Pierwszy bonus bo mam na to czas ;) szybko i sprawnie. Dzisiaj pisałem o funkcjach wyższego rzędu, czyli funkcjach które przyjmują jako parametr funkcję lub funkcję zwracają.
W Elixir mamy wiele takich funkcji jedną z nich jest Enum.map
czy, która przyjmuje funkcję jako parametr. Wygląda to mniej więcej tak:
Enum.map([1, 2], fn x -> x * 2 end)
Ggdzie pierwszym parametrem jest lista elementów, drugim zaś wyrażenie lambda przekazane jako funkcja anonimowa do map. Funkcja ta pomnoży każdy element listy przez dwa.
Można to też inaczej zapisać.
by2 = fn x -> x *2 end Enum.map([1, 2], by2)
Można to jeszcze zapisać tak:
by2a = &(&1 * 2) Enum.map([1, 2], by2a)
Operator & to nic innego jak capture operator o którym już wspominałem. Ogólnie umożliwia on nam tworzenie funkcji anonimowych jak i pojmowanie innych funkcji, czyli to z mnożeniem, możemy zapisać na przykład tak:
by2b = &Kernel.*(&1, 2) Enum.map([1, 2], by2b)
Gdzie &1 (itp. numeryczne) to tak naprawdę wstawki, które umożliwiają podstawianie wartości pod dany parametr. Czyli:
# zwróci 2 by2b.(1) # zwróci 4 by2a.(2)
Po stronie metody przyjmowanie zaś funkcji jest dość proste:
def firstOrder(fun) do fun.() end
jak funkcja ma parametr to przekazujemy parametr w nawiasie.
Zwracanie funkcji – patrz bundowanie funkcji do aliasu pokazane wyżej. Działa tak samo.
To tyle na krótki Bonus elixirowy :)