- 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 - Behave
- 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 选项一起使用,以便轻松删除字符串中的所有空格 -
IO.puts(for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>)
当上面的代码运行时,它会产生以下结果 -
helloworld
上面的代码使用c != ?\s过滤器删除字符串中的所有空格,然后使用 :into 选项,将所有返回的字符放入字符串中。