Elixir - 列表推导式



列表推导式是Elixir中遍历可枚举数据的语法糖。本章我们将使用列表推导式进行迭代和生成。

基础

在可枚举数据章节中,我们学习了Enum模块中的map函数。

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

在这个例子中,我们将一个函数作为第二个参数传入。范围内的每个元素都将传递到该函数中,然后返回一个包含新值的新列表。

映射、过滤和转换在Elixir中非常常见的操作,因此与之前的示例相比,有一种略微不同的方法可以达到相同的结果:

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

运行上述代码后,将产生以下结果:

[2, 4, 6]

第二个例子是一个列表推导式,正如你可能看到的,它只是你也可以使用`Enum.map`函数实现的功能的语法糖。但是,就性能而言,使用列表推导式与使用Enum模块中的函数相比,并没有实际好处。

列表推导式不限于列表,也可以用于所有可枚举数据。

过滤

你可以将过滤器视为列表推导式的一种保护机制。当过滤后的值返回`false`或`nil`时,它将从最终列表中排除。让我们遍历一个范围,只关注偶数。我们将使用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`选项传递到列表推导式,可以将结果插入到不同的数据结构中。

例如,可以使用`:into`选项和一个比特串生成器轻松删除字符串中的所有空格:

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

运行上述代码后,将产生以下结果:

helloworld

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

广告