Elixir - 领悟


列表推导式是 Elixir 中用于循环枚举的语法糖。在本章中,我们将使用推导式进行迭代和生成。

基本

当我们查看枚举章节中的 Enum 模块时,我们遇到了 map 函数。

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

在此示例中,我们将传递一个函数作为第二个参数。该范围内的每个项目都将被传递到函数中,然后将返回一个包含新值的新列表。

映射、过滤和转换是 Elixir 中非常常见的操作,因此实现与前面示例相同的结果的方法略有不同 -

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

当我们运行上面的代码时,它会产生以下结果 -

[2, 4, 6]

第二个示例是一个推导式,正如您可能看到的,它只是语法糖,如果您使用 Enum.map函数也可以实现这一点。然而,就性能而言,使用 Enum 模块中的函数的推导式并没有真正的好处。

推导式不仅限于列表,还可以与所有枚举一起使用。

筛选

您可以将过滤器视为推导式的一种防护。当过滤后的值返回falsenil时,它将被排除在最终列表之外。让我们循环一个范围,只关心偶数。我们将使用Integer 模块中的is_even函数来检查值是否为偶数。

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

当上面的代码运行时,它会产生以下结果 -

[2, 4, 6, 8, 10]

我们还可以在同一个推导式中使用多个过滤器。在is_even过滤器后面添加您想要的另一个过滤器,并用逗号分隔。

:进入选项

在上面的示例中,所有推导式都返回列表作为结果。但是,通过将:into选项传递给推导式,可以将推导式的结果插入到不同的数据结构中。

例如,位生成器可以与 :into 选项一起使用,以便轻松删除字符串中的所有空格 -

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

当上面的代码运行时,它会产生以下结果 -

helloworld

上面的代码使用c != ?\s过滤器删除字符串中的所有空格,然后使用 :into 选项,将所有返回的字符放入字符串中。