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.