第1回先从不变的变量说开来,学过其他编程语言的人都知道,变量之所以叫变量,是因为它会经常变,被修改。假设原本X  = 10,后来再执行X = 24,那么X就从10变成了24,这对于程序新手和老鸟来说,都是永恒不变的真理。但是如果你写Erlang代码还这么认为的话,那么你就错了,大错特错,还会导致编译失败。现在请把你从其他编程语言学的特性忘掉,把自己变成一张白纸,让我们回一趟小学书本,看下解方程的例子。

  知识点1:变量不可变

记得上学的时候,数学老师曾说过:“如果一个等式中有好几处X,那么所有X都是一样的”。举个例子,如下:

题目:二元一次方程,请计算X和Y分别是多少?
X + Y = 10
X - Y = 2

解:
因为X - Y = 2,所以可以得出:Y = X - 2,
将Y代入第一个方程,会变成
X + X - 2 = 10,
再精简成:
2X = 12,所以X = 12/2 = 6
Y = X - 2 = 6 - 2 = 4。

  从上面的方程可以计算得出X等于6,Y等于4,那么X还能是其他值吗?答案是肯定不行,如果你把X改成7,那么上面的二元一次方程怎么算都是错的。如果还不能理解,那么先尝试着接受新思想,旧思想有旧思想的好处,新思想有新思想的好处,旧的不去新的不来。

  实验1:变量不可被修改

Erlang/OTP 23 [erts-11.1.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe] [dtrace]

Eshell V11.1.3  (abort with ^G)
1> X = 6.
6
2> X.
6
3> X = 7.
** exception error: no match of right hand side value 7

  X被赋值为6之后,如果再赋值为7,那么就会报错:no match,意思是X与7不能匹配,所以X = 6并不是赋值,而是进行了一次模式匹配。命令①表示X与6进行匹配,这次匹配是成功的,所以X绑定了6,所以X等于6。

  知识点2:特殊的下划线变量

  下划线变量会被编译器特殊对待,既可以用来当占位符,跳过不关心的赋值,也可以用来避免unused的编译警告。既然是可以用来忽略不必要的赋值,那么下划线变量可以一直被赋值,而不会报错。

  实验2:可以一直被赋值的下划线变量

Erlang/OTP 23 [erts-11.1.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe] [dtrace]

Eshell V11.1.3  (abort with ^G)
1> _ = 10.
10
2> _ = 24.
24
3> _.
* 1: variable '_' is unbound

  下划线第一次被赋值为10,第二次被赋值为24,不会报错,验证了上面说的结论:可以一直被赋值。

  但是当我们要把下划线打印出来的时候,会得到一个错误信息,意思是下划线没有被绑定,所以证明了下划线只是忽略了一次赋值(匹配)。

  在Erlang编程中,一切皆是模式匹配,无处不在,几乎每一行代码都会应用模式匹配,以后的每一回会对不同的数据类型进行模式匹配的实践。

  下一回将介绍模块(Module)的使用,且听下回分解。

  Author:snowcicada

  URL:https://www.cnblogs.com/snowcicada/p/14164471.html

Erlang那些事儿第1回之我是变量,一次赋值永不改变的更多相关文章

  1. Erlang那些事儿第3回之我是函数(fun),万物之源MFA

    Erlang代码到处都是模式匹配,这把屠龙刀可是Erlang的看家本领.独家绝学,之前在<Erlang那些事儿第1回之我是变量,一次赋值永不改变>文章提到过,Erlang一切皆是模式匹配. ...

  2. Erlang那些事儿第2回之我是模块(module),一文件一模块

    前几篇文章会写得比较基础,但是既然要写一系列的文章,还是得从基础开始写.我刚学Erlang碰到最大的问题是,想网上搜索下语法,结果却是寥寥无几,而且介绍得不是很系统,对我了解一些细节是有影响的,正好我 ...

  3. Erlang那些事儿之正儿八经的前言

    说在前面,为啥要码这些,并不是因为喜欢它,恰恰相反,我非常讨厌Erlang(真香警告)这位二郎神(Erlang的谐音),讨厌它的语法,讨厌它不变的变量,讨厌它的一切. 曾经的我,一听到这个语言,我就打 ...

  4. Java8一:Lambda表达式教程

    1. 什么是λ表达式 λ表达式本质上是一个匿名方法.让我们来看下面这个例子: public int add(int x, int y) {         return x + y;     } 转成 ...

  5. Linux就这个范儿 第8章 我是Makefile

    Linux就这个范儿 第8章 我是Makefile P287 Makefile的作用就是——自动化编译,一旦写好,只需要一个make命令(解析Makefile,执行Makefile中描述的操作),整个 ...

  6. Erlang 转至维基百科

    Erlang(英语发音:/ˈɜrlæŋ/)是一种通用的并行程序设计语言,它由乔·阿姆斯特朗(Joe Armstrong)在瑞典电信设备制造商爱立信所辖的计算机科学研究室开发,目的是创造一种可以应付大规 ...

  7. Erlang模块ets翻译

    概要: 内置的存储 描述: 这个模块是Erlang内置存储BIFs的接口.这些提供了在Erlang运行时系统中存储大量数据的能力,并且能够对数据进行持续的访问时间.(在ordered_set的情况下, ...

  8. 说说Makefile那些事儿

    说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...

  9. git reset revert 回退回滚取消提交返回上一版本

    git reset revert 回退回滚取消提交返回上一版本 总有一天你会遇到下面的问题. (1)改完代码匆忙提交,上线发现有问题,怎么办? 赶紧回滚. (2)改完代码测试也没有问题,但是上线发现你 ...

随机推荐

  1. CET-6备考丨词组、佳句积累

    一.片段积累 (2020/09/17) 近三年 CET6 - 翻译 Phrases or Expressions Notes drive to commute to and from work 开车上 ...

  2. linux下安装python3.7.1

    一.安装依赖环境 输入命令:yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readlin ...

  3. qsort的cmp函数理解

    qsort使用 近期频繁使用qsort函数,但是对于cmp函数却一直不太熟悉,现用现查.故写一篇小笔记记录一下. 函数原型: void qsort(void *base,size_t NumEle,s ...

  4. Linux下的MediaWiki的部署启动遇到的问题与解决方案

    1. MySQL安装不成功 解决方案:https://bbs.csdn.net/topics/394377536 2. no space left on device ubuntu 解决方案:http ...

  5. 【鸿蒙应用开发】第三章 “颜控”时代下如何构建UI界面

    为什么是第三章,前面两章呢? 原本是以碎片化的方式将HarmonyOS应用开发快速掌握,但是在准备六大布局组合复杂UI界面Demo时,很多组件之前都没有应用.因此准备将知识体系进行细化,以章节的形式希 ...

  6. java面试复习重点:类的管理及常用工具,教你抓住面试的重点!

    java复习: 类的管理及常用工具类 包 写在程序文件的第一行 一个Java 源文件中只能声明一个包, 且声明语句只能作为源文件的第一条指令 导入类能导入非public类,但是不能用因为在其他包缺省的 ...

  7. 使用RestTemplate,显示请求信息,响应信息

    使用RestTemplate,显示请求信息,响应信息 这里不讲怎么用RestTemplate具体细节用法,就是一个学习中的过程记录 一个简单的例子 public class App { public ...

  8. PyQt(Python+Qt)学习随笔:QTreeWidgetItem项下子项的指示符展示原则childIndicatorPolicy

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 树型部件QTreeWidget中的QTreeWidgetItem项下可以有子项,如果存在子项,则父项 ...

  9. 第15.12节PyQt(Python+Qt)入门学习:可视化设计界面组件布局详解

    一.引言 在Qt Designer中,在左边部件栏的提供了界面布局相关部件,如图: 可以看到共包含有四种布局部件,分别是垂直布局(Vertical Layout).水平布局(Horizontal La ...

  10. PyQt(Python+Qt)学习随笔:使用QtWidgets.qApp实现在程序中随时访问应用的方法

    在PyQt应用中,任何一个应用在启动时必须创建一个基于QtWidgets.QApplication或其派生类对应的应用对象,该对象用于处理事件. 如果需要在应用代码中的任何位置都能访问该应用对象,可以 ...