📜  Elixir-理解

📅  最后修改于: 2020-11-04 08:30:16             🧑  作者: Mango


 

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

基本

当我们在“可枚举”一章中查看Enum模块时,我们遇到了map函数。

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

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

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

for n 

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

[2, 4, 6]

第二个示例是一个理解,您可能会看到,它只是语法糖,如果您使用Enum.map函数,也可以实现。但是,就性能而言,使用对Enum模块的函数的理解并没有真正的好处。

理解不仅限于列表,还可以用于所有枚举。

过滤

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

import Integer
IO.puts(for x 

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

[2, 4, 6, 8, 10]

我们还可以在同一理解中使用多个过滤器。在以逗号分隔的is_even过滤器之后添加所需的另一个过滤器。

:进入选项

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

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

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

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

helloworld

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