エリクサー-内包表記

リスト内包表記は、Elixirの列挙型をループするためのシンタックスシュガーです。この章では、反復と生成に内包表記を使用します。

基本

enumerablesの章でEnumモジュールを見ると、map関数に出くわしました。

Enum.map(1..3, &(&1 * 2))

この例では、2番目の引数として関数を渡します。範囲内の各項目が関数に渡され、新しい値を含む新しいリストが返されます。

マッピング、フィルタリング、および変換はElixirで非常に一般的なアクションであるため、前の例と同じ結果を達成する方法は少し異なります。

for n <- 1..3, do: n * 2

上記のコードを実行すると、次の結果が生成されます-

[2, 4, 6]

2番目の例は理解です。おそらくおわかりのように、これは、を使用した場合にも達成できることの単なる構文糖衣です。 Enum.map関数。ただし、パフォーマンスの観点から、Enumモジュールの関数よりも理解を使用することに実際の利点はありません。

内包表記はリストに限定されず、すべての列挙型で使用できます。

フィルタ

フィルタは、理解のための一種のガードと考えることができます。フィルタリングされた値が返されるときfalse または nil最終リストから除外されます。範囲をループして、偶数についてのみ心配しましょう。を使用しますis_even 整数モジュールの関数を使用して、値が偶数かどうかを確認します。

import Integer
IO.puts(for x <- 1..10, is_even(x), do: x)

上記のコードを実行すると、次の結果が生成されます-

[2, 4, 6, 8, 10]

同じ理解で複数のフィルターを使用することもできます。後に必要な別のフィルターを追加しますis_even カンマで区切られたフィルター。

:オプションに

上記の例では、すべての内包表記が結果としてリストを返しました。ただし、理解の結果は、を渡すことによってさまざまなデータ構造に挿入できます。:into 理解へのオプション。

たとえば、 bitstring 文字列内のすべてのスペースを簡単に削除するために、ジェネレータを:intoオプションとともに使用できます-

IO.puts(for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>)

上記のコードを実行すると、次の結果が生成されます-

helloworld

上記のコードは、を使用して文字列からすべてのスペースを削除します c != ?\s フィルタしてから:intoオプションを使用すると、返されたすべての文字が文字列に入れられます。