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)改完代码测试也没有问题,但是上线发现你 ...
随机推荐
- 关于ABBYY的常见问题与解答
问:ABBYY的版本那么多,我不知道哪款是我需要的.可不可以帮助我选择? 答:您可在此查看不同版本的功能介绍与版本对比,选择适合自己的版本即可. 查看ABBYY FineReader 15功能:查看A ...
- 鱼骨图是什么?怎么用iMindMap画鱼骨图?
鱼骨图是一种发现问题"根本原因"的方法,它也可以称之为"因果图".其特点是简捷实用,深入直观."鱼头"处标注的一般是问题或后果.按出现机会多 ...
- Leetcode 周赛#200 题解
1535 找出数组游戏的赢家 #模拟+优化 题目链接 题意 给你一个由 不同 整数组成的整数数组 arr 和一个整数 k(\(1\leq k\leq1e9\)) .每回合游戏都在数组的arr[0] 和 ...
- leetcode_3FizzBuzz的一些思考
题目很简单,给定一个正整数n,如果n能整除3的话往list里加入Fizz,如果n能整除5的话往list里面加入Buzz,如果即能整除3又能整除5的话,加入FizzBuzz,代码也很简单 public ...
- 通过 GraalVM 将 Java 程序编译成本地机器码!
前言 2018年4月,Oracle Labs新公开了一项黑科技:Graal VM. 这是一个在HotSpot虚拟机基础上增强而成的跨语言全栈虚拟机,可以作为"任何语言"的运行平台使 ...
- 最新小样本学习综述 A Survey on Few-Shot Learning | 四大模型Multitask Learning、Embedding Learning、External Memory…
目录 原文链接: 小样本学习与智能前沿 01 Multitask Learning 01.1 Parameter Sharing 01.2 Parameter Tying. 02 Embedding ...
- 【NOIP2017提高A组模拟9.7】JZOJ 计数题
[NOIP2017提高A组模拟9.7]JZOJ 计数题 题目 Description Input Output Sample Input 5 2 2 3 4 5 Sample Output 8 6 D ...
- 浅尝 Elastic Stack (一) Elasticsearch、Kibana、Beats 安装
Elastic Stack 包括 Elasticsearch.Kibana.Beats 和 Logstash,也称为 ELK Stack.能够安全可靠地获取任何来源.任何格式的数据,然后实时地对数据进 ...
- windows服务器下tomcat 8.0 配置远程调试
在tomcat的bin目录下, 添加debug.txt文件, 然后输入: set JPDA_ADDRESS=9901set JPDA_TRANSPORT=dt_socketset CATALINA_O ...
- 树莓派RTL8723BU_LINUX驱动安装
1.安装前准备:sudo apt-get -y update;sudo apt-get -y upgrade;sudo apt-get -y dist-upgrade;sudo apt-get ins ...