Эликсир - Петли

Из-за неизменности циклы в Elixir (как и в любом функциональном языке программирования) пишутся не так, как императивные языки. Например, в императивном языке, таком как C, вы напишете -

for(i = 0; i < 10; i++) {
   printf("%d", array[i]);
}

В приведенном выше примере мы изменяем как массив, так и переменную i. В Эликсире мутации невозможны. Вместо этого функциональные языки полагаются на рекурсию: функция вызывается рекурсивно до тех пор, пока не будет достигнуто условие, останавливающее продолжение рекурсивного действия. В этом процессе данные не изменяются.

Давайте теперь напишем простой цикл, используя рекурсию, которая печатает привет n раз.

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)

Когда вышеуказанная программа запускается, она дает следующий результат -

Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello

Мы использовали методы сопоставления с образцом в функциях и рекурсию, чтобы успешно реализовать цикл. Рекурсивные определения трудно понять, но преобразовать циклы в рекурсию легко.

Эликсир предоставляет нам Enum module. Этот модуль используется для большинства итеративных вызовов циклов, поскольку их гораздо проще использовать, чем пытаться выяснить рекурсивные определения для них. Мы обсудим это в следующей главе. Ваши собственные рекурсивные определения следует использовать только в том случае, если вы не нашли решения с помощью этого модуля. Эти функции оптимизированы для хвостовых вызовов и работают довольно быстро.