文档章节

elixir官方入门教程 模式匹配

ljzn
 ljzn
发布于 2016/08/02 15:46
字数 988
阅读 55
收藏 0

#模式匹配

1. 匹配操作符
2. 模式匹配
3. 标记操作符

在本章,我们将展示在Elixir中=号实际上是匹配操作符,以及如何使用它在数据结构中进行模式匹配。最后,我们会学习使用标记操作符^来访问之前绑定的值。

#匹配操作符

我们已经在Elixir中多次使用=操作符为变量赋值:

iex> x = 1
1
iex> x
1

事实上,在Elixir中=操作符被称为匹配操作符。原因是:

iex> 1 = x
1
iex> 2 = x
** (MatchError) no match of right hand side value: 1

注意到1 = x是一个合法表达式,因为左右两边都等于1所以能够匹配。当不匹配时,便会抛出一个MatchError错误。

变量只能在=左边被赋值。

iex> 1 = unknown
** (CompileError) iex:1: undefined function unknown/0

由于之前未定义变量unknow,所以Elixir认为你在试图调用一个名为unknow/0的函数,但该函数并不存在。

#模式匹配

匹配操作符不止能用来匹配简单的值,还可以用于解构复杂的数据类型。例如,我们可以对元组进行模式匹配:

iex> {a, b, c} = {:hello, "world", 42}
{:hello, "world", 42}
iex> a
:hello
iex> b
"world"

当两边不匹配时会出现错误。例如,元组的大小不同:

iex> {a, b, c} = {:hello, "world"}
** (MatchError) no match of right hand side value: {:hello, "world"}

或者类型不匹配:

iex> {a, b, c} = [:hello, "world", 42]
** (MatchError) no match of right hand side value: [:hello, "world", 42]

有趣的是,我们可以匹配特殊的值。比如下面的例子,当右边是一个以:ok开头的元组时才能匹配:

iex> {:ok, result} = {:ok, 13}
{:ok, 13}
iex> result
13

iex> {:ok, result} = {:error, :oops}
** (MatchError) no match of right hand side value: {:error, :oops}

我们可以对列表进行模式匹配:

iex> [a, b, c] = [1, 2, 3]
[1, 2, 3]
iex> a
1

列表支持匹配它的头尾:

iex> [head | tail] = [1, 2, 3]
[1, 2, 3]
iex> head
1
iex> tail
[2, 3]

与函数hd/1tl/1类似,我们不能够匹配空列表的头尾:

iex> [h | t] = []
** (MatchError) no match of right hand side value: []

[head | tail]格式不仅用于模式匹配,还可用于往列表前添加元素:

iex> list = [1, 2, 3]
[1, 2, 3]
iex> [0 | list]
[0, 1, 2, 3]

模式匹配使得开发者能够简单地解构例如元组和列表的数据类型。在之后的章节中我们将看到这是Elixir中递归的基础,且其适用于其它类型,例如映射与二进制。

#标记操作符

变量在Elixir中可以被重新赋值:

iex> x = 1
1
iex> x = 2
2

当你想要对变量值进行模式匹配,而不是重新赋值时,就可以使用标记操作符^

iex> x = 1
1
iex> ^x = 2
** (MatchError) no match of right hand side value: 2
iex> {y, ^x} = {2, 1}
{2, 1}
iex> y
2
iex> {y, ^x} = {2, 2}
** (MatchError) no match of right hand side value: {2, 2}

由于我们已经将1赋值给变量x,最后一个例子也可以写成:

iex> {y, 1} = {2, 2}
** (MatchError) no match of right hand side value: {2, 2}

在某些情况下,你并不关心模式中特定的值。可以使用下划线_将那些值捆绑起来。例如,如果我们只看重列表头,那么可以将尾赋值给下划线:

iex> [h | _] = [1, 2, 3]
[1, 2, 3]
iex> h
1

变量_的特别之处在于它永远不可以被读取。试图读取它时会返回一个未指定变量的错误:

iex> _
** (CompileError) iex:1: unbound variable _

尽管模式匹配使我们能够创建强大的结构体,它的用途依旧有限。例如,你不能够在匹配的左边调用函数:

iex> length([1, [2], 3]) = 3
** (CompileError) iex:1: illegal pattern

关于模式匹配的介绍到此结束,在下一章我们会看到,模式匹配在许多语言结构体里非常常见。

© 著作权归作者所有

ljzn
粉丝 30
博文 69
码字总数 96245
作品 0
南平
程序员
私信 提问
Elixir 学习资源

Elixir 官网 getting started官方入门学习资源 官方文档 hex 包管理系统 elixir sips 比较不错视频课程 Elixir China 中文论坛 官方wiki Elixir by Example Awesome Elixir Elixir Quiz 通过...

lidashuang
2017/11/29
0
0
elixir官方入门教程 进程

进程 和 链接 任务 状态 在Elixir中,所有代码都运行在进程内。进程相互独立,并发地运行,通过传送信息来交流。进程不是Elixir中唯一的并发基础,但它意味着能够构建分布式的,可容错的程序...

ljzn
2016/08/04
34
0
Elixir学习笔记(模型匹配、控制语句)

模型匹配 模式匹配是 Elixir 很强大的特性,它允许我们匹配简单值、数据结构、甚至函数。 匹配运算符 在Elixir中,运算符实际上叫做 匹配运算符。通过这个匹配操作符,我们可以赋值和匹配值。...

程序员小哥哥
2018/04/12
0
0
elixir官方入门教程 介绍

介绍 安装 交互模式 运行脚本 提出疑问 欢迎! 在本教程中我们将教给你Elixir的基础,语法,如何定义模块,如何操作常用数据结构的特性等等.本章将确保Elixir安装好了,并且你能够成功运行Elixir的...

ljzn
2016/08/06
70
0
从 Go 开发者的角度看 Elixir 的设计思想

从 Go 开发者的角度看 Elixir 的设计思想 免责声明: 这篇文章不是带你入门的,我只是把玩了一下这个编程语言,也不是什么专家,就把我写的当做一道开胃菜吧。我只是把我几个小时的调研结果汇...

drkaka
2016/01/07
5.7K
4

没有更多内容

加载失败,请刷新页面

加载更多

浅谈 Spark 的多语言支持

作者:郑锴,花名铁杰,阿里巴巴高级技术专家,Apache Hadoop PMC,Apache Kerby 创立者。深耕分布式系统开发和开源大数据多年,先后专注在安全,存储和计算领域。之前在 Intel,目前转战阿里...

阿里云云栖社区
28分钟前
2
0
Linux运维常见的硬件及系统问题

一、服务器常见故障和现象 1、有关服务器无法启动的主要原因 : ①市电或电源线故障(断电或接触不良) ②电源或电源模组故障 ③内存故障(一般伴有报警声) ④CPU故障(一般也会有报警声) ⑤主板故...

寰宇01
36分钟前
0
0
Confluence 6 针对 'unmigrated-wiki-markup' 宏重新尝试合并

在签名的章节中,我们主要是针对没有完全合并完成余下的为合并内容的异常处理。最常见的情况是内容以及被合并了,但是页面使用 wiki 标记的内容没有被合并,通常这些 wiki 标记的内容使用了 ...

honeymoose
46分钟前
2
0
ubuntu 18.04桌面版启动错误: Unable to mount root fs on unknown-block(0,0)

问题出现过程 *** 我的环境: visualbox 虚拟机 Ubuntu 18.04 桌面版 IP:192.168.1.186 (最初从 192.168.1.185 克隆过来的) 20190423 晚上准备安装一个 UNlet standalone 和 一个 Eclips...

wwzzhh166
47分钟前
1
0
fescar select for update 读隔离级别实现

/* * Copyright 1999-2018 Alibaba Group Holding Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in complian......

xiaomin0322
50分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部