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