Учебники

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

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

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

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

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

Live Demo

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