当前位置: 首页 > 文档资料 > Elixir 中文教程 >

理解( Comprehensions)

优质
小牛编辑
129浏览
2023-12-01

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

Basics

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

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

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

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

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

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

[2, 4, 6]

第二个例子是一个理解,正如你可能看到的,如果你使用Enum.map函数,它只是你可以实现的语法糖。 但是,在性能方面使用对Enum模块的函数的理解没有任何实际好处。

理解不仅限于列表,而是可以与所有可用的枚举一起使用。

Filter

您可以将过滤器视为一种理解的保护。 当筛选的值返回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选项传递给理解,可以将理解的结果插入到不同的数据结构中。

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

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

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

helloworld

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