Из-за неизменности циклы в 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 . Этот модуль используется для большинства итеративных циклических вызовов, поскольку их гораздо проще использовать, чем пытаться определить рекурсивные определения для них. Мы обсудим это в следующей главе. Ваши собственные рекурсивные определения следует использовать только тогда, когда вы не можете найти решение с использованием этого модуля. Эти функции оптимизированы для быстрого вызова.