官术网_书友最值得收藏!

  • Mastering Elixir
  • André Albuquerque Daniel Caixinha
  • 128字
  • 2021-08-05 10:42:48

Comprehensions

Elixir provides another construct to iterate collections: comprehensions. As with the functions from the Enum module, comprehensions work on anything that implements the Enumerable protocol. Let's see a simple example:

iex> for x <- [2, 4, 6], do: x * 2
[4, 8, 12]

While, in this simple example, it is similar to Enum.map/2, comprehensions bring some other interesting features. You can, for instance, iterate over multiple collections and also apply filters. Let's see these two being applied in the following example:

iex> for x <- [1, 2, 3], y <- [4, 5, 6], Integer.is_odd(x), do: x * y
[4, 5, 6, 12, 15, 18]

Here we're doing a nested iterationfor each element of the first enumerable (which is represented by x), we will iterate through all elements of the second enumerable (represented by y). Also, we're applying a filter, and the body of our comprehension only gets executed when x is odd.

We won't be using comprehensions in the application we'll build throughout this book. However, it's important to mention them, as there are cases where using a comprehension instead of functions from the Enum module renders more elegant and expressive code

In our example, all comprehensions are returning a list, which is the default behavior. We can change that by passing the into: option, as you can see in this example:

iex> for x <- [1, 2, 3], into: %{}, do: {x, x + 1}
%{1 => 2, 2 => 3, 3 => 4}

As you can see, now we're getting a map back. The into: option takes a collection that will receive the results of the comprehension. This collection must implement the Collectable protocol. This protocol can be seen as the opposite of the Enumerable protocol, and is used to create a new structure from the values of an existing collection. This also has usage outside of comprehensions the  Enum.into/2 function uses this protocol to create a new collection based on an enumerable.
主站蜘蛛池模板: 贵港市| 轮台县| 泽普县| 南乐县| 凤阳县| 海丰县| 东乡族自治县| 达孜县| 三原县| 贵港市| 元阳县| 石首市| 祥云县| 南平市| 特克斯县| 若尔盖县| 昭通市| 莫力| 巨野县| 灵璧县| 始兴县| 曲靖市| 岑溪市| 商洛市| 星子县| 凉城县| 新昌县| 利辛县| 五寨县| 泰和县| 砀山县| 梨树县| 阜新市| 南川市| 米易县| 衡南县| 江华| 兴化市| 荃湾区| 全州县| 大宁县|