Elixir-comprehensions
エリクサー-理解
リストの内包表記は、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オプション
上記の例では、すべての内包表記が結果としてリストを返しました。 ただし、内包表記の結果は、*:into *オプションを内包表記に渡すことにより、異なるデータ構造に挿入できます。
たとえば、文字列内のすべてのスペースを簡単に削除するために、:intoオプションで bitstring ジェネレータを使用できます-
IO.puts(for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>)
上記のコードを実行すると、次の結果が生成されます-
helloworld
上記のコードは、 c!=?\ s フィルターを使用して文字列からすべてのスペースを削除し、:intoオプションを使用して、返されたすべての文字を文字列に入れます。