美文网首页
Elixir-推导

Elixir-推导

作者: 你期待的花开 | 来源:发表于2018-11-14 17:36 被阅读15次

在 Elixir 中,列表推导是循环遍历枚举值的语法糖。

基础

推导经常用来根据 EnumStream生成表达式,首先看一个例子,然后分析它的结构。

iex> list = [1, 2, 3, 4, 5]
iex> for x <- list, do: x*x
[1, 4, 9, 16, 25]

首先注意 for 和生成器的使用。什么是生成器呢?生成器就是上面的 x <- [1, 2, 3, 4, 5]表达式的部分,他们用来生成下一个值。
幸运的是,推导式不仅可以用在列表上,他们实际上可用在任何可遍历类型。

# 关键字列表
iex> for {_key, val} <- [one: 1, two: 2, three: 3], do: val
[1, 2, 3]

# 字典
iex> for {k, v} <- %{"a" => "A", "b" => "B"}, do: {k, v}
[{"a", "A"}, {"b", "B"}]

# 二进制
iex> for <<c <- "hello">>, do: <<c>>
["h", "e", "l", "l", "o"]

和 Elixir 很多东西一样,生成器也依靠模式匹配来比较他们的输入和左边的变量。如果撇皮没有找到,对应的值就直接忽略。

iex> for {:ok, val} <- [ok: "Hello", error: "Unknown", ok: "World"], do: val
["Hello", "World"]

也可以同时使用多个生成器,达到类似嵌套循环的效果:

iex> list = [1, 2, 3, 4]
iex> for n <- list, times <- 1..n do
...>   String.duplicate("*", times)
...> end
["*", "*", "**", "*", "**", "***", "*", "**", "***", "****"]

为了更清晰地展示循环的内容,我们用 IO.puts 来打印出生成的两个值。

iex> for n <- list, times <- 1..n, do: IO.puts "#{n} - #{times}"
1 - 1
2 - 1
2 - 2
3 - 1
3 - 2
3 - 3
4 - 1
4 - 2
4 - 3
4 - 4

列表推导只是语法糖,应该用在适当的地方。

过滤器

你可以把过滤器想象成推导式的哨兵,如果被过滤额返回值是 false 或者 nil,那它就不会出现在最终的列表里,比如可以循环某个范围的值,但是只给出偶数,我们使用Integer模块提供的is_even/1函数来检查某个值是否为偶数。

import Integer
iex> for x <- 1..10, is_even(x), do: x
[2, 4, 6, 8, 10]

像生成器一样,我们可以使用多个过滤器,我们修改上面的例子,只返回所有是偶数并且能被 3 整除的值。

import Integer
iex> for x <- 1..100,
...>   is_even(x),
...>   rem(x, 3) == 0, do: x
[6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, 78, 84, 90, 96]

使用 :info

如果我们生成的不是列表呢?:info选项就可以解决这个问题了,:info 接受实现了Collectable 协议的任何结构体。让我们用:info 从关键字列表中创建一个字典出来:

iex> for {k, v} <- [one: 1, two: 2, three: 3], into: %{}, do: {k, v}
%{one: 1, three: 3, two: 2}

因为位串也是可以枚举的,所以我们可以使用推导式和:info来创建字符串。

相关文章

  • Elixir-推导

    在 Elixir 中,列表推导是循环遍历枚举值的语法糖。 基础 推导经常用来根据 Enum 和 Stream生...

  • Elixir-组合

    模块 模块是把函数组织到不同命名空间的最好的办法,除了能为函数分组,他还允许我们定义命名函数和私有函数。 Elix...

  • Elixir-函数

    目录 匿名函数& 操作符 模式匹配 命名函数函数名字和元数私有函数卫兵参数默认值 匿名函数 匿名函数就是没有名字,...

  • Elixir-并发

    Elixir 的一大卖点就是对并发的支持,得益于 Erlang VM (BEAM) ,Elixir 的并发要比预期...

  • Elixir-基础

    安装 在https://elixir-lang.org 上可以找到安装说明。 使用 elixir -v 查看 el...

  • Elixir-集合

    列表、元组、关键字列表(keywords)、图(maps)、字典和函数组合子(combinators) 目录 列表...

  • Python中各种推导式

    Python的各种推导式(列表推导式,字典推导式,集合推导式) 列表(list)推导式 字典(dict)推导式 集...

  • 016 Python语法之推导式

    推导式 特性 好好应用推导式后面的条件判断 列表推导式 字典推导式 集合推导式 生成器推导式

  • 推导式 生成器 迭代器

    推导式 生成器 迭代器 1.推导式 推导式:列表推导式、字典推导式、集合推导式语法 [变量 for 变量 in 旧...

  • python推导式

    python的各种推导式(列表推导式、字典推导式、集合推导式) 推导式comprehensions(又称解析式),...

网友评论

      本文标题:Elixir-推导

      本文链接:https://www.haomeiwen.com/subject/jubqmftx.html