エリクサー-内包表記
リスト内包表記は、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オプションを使用すると、返されたすべての文字が文字列に入れられます。