Elixir-loops

提供:Dev Guides
移動先:案内検索

エリクサー-ループ

不変性のため、Elixirのループは(関数型プログラミング言語のように)命令型言語とは異なる方法で記述されています。 たとえば、Cのような命令型言語では、次のように記述します-

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

上記の例では、配列と変数 i の両方を変更しています。 Elixirでは変更はできません。 代わりに、関数型言語は再帰に依存しています。関数は、再帰アクションの継続を停止する条件に達するまで再帰的に呼び出されます。 このプロセスではデータは変更されません。

再帰を使用して、 n 回helloを出力する単純なループを記述しましょう。

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

関数のパターンマッチング手法と再帰を利用して、ループを正常に実装しました。 再帰的な定義を理解することは困難ですが、ループを再帰に変換することは簡単です。

Elixirは* Enumモジュール*を提供します。 このモジュールは、同じものの再帰的な定義を理解しようとするよりも簡単に使用できるため、最も反復的なループ呼び出しに使用されます。 これらについては次の章で説明します。 独自の再帰的な定義は、そのモジュールを使用したソリューションが見つからない場合にのみ使用してください。 これらの関数はテールコールに最適化されており、非常に高速です。