理解( 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
您可以将过滤器视为一种理解的保护。 当筛选的值返回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选项传递给理解,可以将理解的结果插入到不同的数据结构中。
例如,一个bitstring生成器可以与:into选项一起使用,以便轻松删除字符串中的所有空格 -
IO.puts(for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>)
运行上面的代码时,它会产生以下结果 -
helloworld
上面的代码使用c != ?\s过滤器从字符串中删除所有空格,然后使用:into选项,它将所有返回的字符放在一个字符串中。