📅  最后修改于: 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模块的函数的理解并没有真正的好处。
理解不仅限于列表,还可以用于所有枚举。
您可以将过滤器视为对理解的一种保护。当过滤后的值返回false或nil时,它将被排除在最终列表之外。让我们遍历一个范围,只担心偶数。我们将使用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选项,将所有返回的字符放入字符串。