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 选项传递给推导式,可以将推导式的结果插入到不同的数据结构中。

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

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

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

helloworld

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