Erlang那些事儿第1回之我是变量,一次赋值永不改变
第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回之我是变量,一次赋值永不改变的更多相关文章
- Erlang那些事儿第3回之我是函数(fun),万物之源MFA
Erlang代码到处都是模式匹配,这把屠龙刀可是Erlang的看家本领.独家绝学,之前在<Erlang那些事儿第1回之我是变量,一次赋值永不改变>文章提到过,Erlang一切皆是模式匹配. ...
- Erlang那些事儿第2回之我是模块(module),一文件一模块
前几篇文章会写得比较基础,但是既然要写一系列的文章,还是得从基础开始写.我刚学Erlang碰到最大的问题是,想网上搜索下语法,结果却是寥寥无几,而且介绍得不是很系统,对我了解一些细节是有影响的,正好我 ...
- Erlang那些事儿之正儿八经的前言
说在前面,为啥要码这些,并不是因为喜欢它,恰恰相反,我非常讨厌Erlang(真香警告)这位二郎神(Erlang的谐音),讨厌它的语法,讨厌它不变的变量,讨厌它的一切. 曾经的我,一听到这个语言,我就打 ...
- Java8一:Lambda表达式教程
1. 什么是λ表达式 λ表达式本质上是一个匿名方法.让我们来看下面这个例子: public int add(int x, int y) { return x + y; } 转成 ...
- Linux就这个范儿 第8章 我是Makefile
Linux就这个范儿 第8章 我是Makefile P287 Makefile的作用就是——自动化编译,一旦写好,只需要一个make命令(解析Makefile,执行Makefile中描述的操作),整个 ...
- Erlang 转至维基百科
Erlang(英语发音:/ˈɜrlæŋ/)是一种通用的并行程序设计语言,它由乔·阿姆斯特朗(Joe Armstrong)在瑞典电信设备制造商爱立信所辖的计算机科学研究室开发,目的是创造一种可以应付大规 ...
- Erlang模块ets翻译
概要: 内置的存储 描述: 这个模块是Erlang内置存储BIFs的接口.这些提供了在Erlang运行时系统中存储大量数据的能力,并且能够对数据进行持续的访问时间.(在ordered_set的情况下, ...
- 说说Makefile那些事儿
说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...
- git reset revert 回退回滚取消提交返回上一版本
git reset revert 回退回滚取消提交返回上一版本 总有一天你会遇到下面的问题. (1)改完代码匆忙提交,上线发现有问题,怎么办? 赶紧回滚. (2)改完代码测试也没有问题,但是上线发现你 ...
随机推荐
- C语言讲义——内存管理
动态分配内存 动态分配内存,在堆(heap)中分配. void *malloc(unsigned int num_bytes); 头文件 stdlib.h或malloc.h 向系统申请分配size个字 ...
- serialVersionUID作用是什么以及如何生成的?
目录 正常不设置serialVersionUID 的序列化和反序列化 序列化之后,类文件增加了字段,反序列化会怎么样? 指定serialVersionUID,减少或者增加字段会发生什么? serial ...
- 题解 洛谷 P2612 【[ZJOI2012]波浪】DP+高精
题目描述 题目传送门 分析 因为有绝对值不好处理,所以我们强制从小到大填数 设 \(f[i][j][p][o]\) 为当前填到了第 \(i\) 个数,波动强度为 \(j\),有 \(p\) 个连续段并 ...
- 路由器/交换机Console口登录密码丢失后如何恢复
Console口登录密码丢失后如何恢复 如果忘记了Console口登录密码,用户可以通过以下两种方式来设置新的Console口登录密码. 通过STelnet/Telnet登录路由器/交换机设置新的Co ...
- 单体->集群->模块化->分布式微服务
开头语: 每篇一段开头语,在技术的道路中寻找文采的乐趣.(如果随笔中都是大白话勿喷,兄弟姐妹们) 单体项目 单体项目适用于小型开发,或自己来进行小项目的测试和使用. 单体项目的缺憾 多人开发项目所出现 ...
- IdentityServer4系列 | 简化模式
一.前言 从上一篇关于资源密码凭证模式中,通过使用client_id和client_secret以及用户名密码通过应用Client(客户端)直接获取,从而请求获取受保护的资源,但是这种方式存在clie ...
- PyQt学习随笔:Model/View设计中支持视图中数据修改的方法及步骤
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 要支持视图中的数据可以修改,需要两个步骤: 1. 在视图中设置editTriggers属性支持在视图 ...
- 第15.6节 PyQt5安装与配置
一. 引言 关于PyQt5的安装网上有很多的文章,老猿也是学习了好多,最后结合其他模块安装的知识发现其实安装很简单,就是直接使用pip或pip3安装就可以了,这样既无需预先下载好软件,也无需担心版本的 ...
- JAVA课堂题目--递归来判断回数
package class20190923; import java.util.Scanner; public class Classtext { private static int n=0; pr ...
- java中的反射(一)
在之前学java基础时学习过反射,但在因为没有相应的应用场景,所以也是一知半解.最近在学spring的时候发现反射是其中很重要的一部分,所以回顾一下,并看看它在spring中的应用. 目录 一.反射 ...