- Elixir 教程
- Elixir - 首页
- Elixir - 概述
- Elixir - 环境配置
- Elixir - 基本语法
- Elixir - 数据类型
- Elixir - 变量
- Elixir - 运算符
- Elixir - 模式匹配
- Elixir - 条件语句
- Elixir - 字符串
- Elixir - 字符列表
- Elixir - 列表和元组
- Elixir - 关键字列表
- Elixir - 映射
- Elixir - 模块
- Elixir - 别名
- Elixir - 函数
- Elixir - 递归
- Elixir - 循环
- Elixir - 可枚举数据
- Elixir - 流
- Elixir - 结构体
- Elixir - 协议
- Elixir - 文件I/O
- Elixir - 进程
- Elixir - 符号
- Elixir - 列表推导式
- Elixir - 类型说明
- Elixir - 行为
- Elixir - 错误处理
- Elixir - 宏
- Elixir - 库
- Elixir 有用资源
- Elixir - 快速指南
- Elixir - 有用资源
- Elixir - 讨论
Elixir - 列表推导式
列表推导式是Elixir中遍历可枚举数据的语法糖。本章我们将使用列表推导式进行迭代和生成。
基础
在可枚举数据章节中,我们学习了Enum模块中的map函数。
Enum.map(1..3, &(&1 * 2))
在这个例子中,我们将一个函数作为第二个参数传入。范围内的每个元素都将传递到该函数中,然后返回一个包含新值的新列表。
映射、过滤和转换在Elixir中非常常见的操作,因此与之前的示例相比,有一种略微不同的方法可以达到相同的结果:
for n <- 1..3, do: n * 2
运行上述代码后,将产生以下结果:
[2, 4, 6]
第二个例子是一个列表推导式,正如你可能看到的,它只是你也可以使用`Enum.map`函数实现的功能的语法糖。但是,就性能而言,使用列表推导式与使用Enum模块中的函数相比,并没有实际好处。
列表推导式不限于列表,也可以用于所有可枚举数据。
过滤
你可以将过滤器视为列表推导式的一种保护机制。当过滤后的值返回`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选项
在上面的例子中,所有列表推导式的结果都返回列表。但是,通过将`:into`选项传递到列表推导式,可以将结果插入到不同的数据结构中。
例如,可以使用`:into`选项和一个比特串生成器轻松删除字符串中的所有空格:
IO.puts(for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>)
运行上述代码后,将产生以下结果:
helloworld
上面的代码使用`c != ?\s`过滤器删除字符串中的所有空格,然后使用`:into`选项将所有返回的字符放入一个字符串中。
广告