Elixir - Loops
Ze względu na niezmienność pętle w Elixirze (jak w każdym funkcjonalnym języku programowania) są pisane inaczej niż w językach imperatywnych. Na przykład w imperatywnym języku, takim jak C, napiszesz -
for(i = 0; i < 10; i++) {
printf("%d", array[i]);
}
W powyższym przykładzie mutujemy zarówno tablicę, jak i zmienną i. Mutowanie nie jest możliwe w Elixirze. Zamiast tego języki funkcyjne opierają się na rekurencji: funkcja jest wywoływana rekurencyjnie, dopóki nie zostanie spełniony warunek, który uniemożliwia kontynuowanie działania rekurencyjnego. Żadne dane nie są modyfikowane w tym procesie.
Napiszmy teraz prostą pętlę wykorzystującą rekurencję, która wypisuje hello n czasy.
defmodule Loop do
def print_multiple_times(msg, n) when n <= 1 do
IO.puts msg
end
def print_multiple_times(msg, n) do
IO.puts msg
print_multiple_times(msg, n - 1)
end
end
Loop.print_multiple_times("Hello", 10)
Uruchomienie powyższego programu daje następujący wynik -
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Wykorzystaliśmy techniki dopasowania wzorców funkcji i rekurencję, aby pomyślnie zaimplementować pętlę. Definicje rekurencyjne są trudne do zrozumienia, ale konwersja pętli na rekurencję jest łatwa.
Elixir zapewnia nam Enum module. Ten moduł jest używany do najbardziej iteracyjnych wywołań pętli, ponieważ jest o wiele łatwiejszy w użyciu niż próba znalezienia rekurencyjnych definicji dla tego samego. Omówimy je w następnym rozdziale. Własnych definicji rekurencyjnych należy używać tylko wtedy, gdy nie można znaleźć rozwiązania za pomocą tego modułu. Te funkcje są zoptymalizowane i dość szybkie.